【问题标题】:JavaFX ProgressBar: how to change bar color?JavaFX ProgressBar:如何更改条形颜色?
【发布时间】:2012-11-01 15:58:21
【问题描述】:

我正在尝试用

更改 ProgressBar 中的条形颜色
pBar.setStyle("-fx-accent: green");

但我遇到了一个问题:这似乎不适合我! (或者我只是不明白)

代码如下:

public class JavaFXApplication36 extends Application {

@Override
public void start(Stage primaryStage) {
AnchorPane root = new AnchorPane();
ProgressBar pbRed = new ProgressBar(0.4);
ProgressBar pbGreen = new ProgressBar(0.6);
pbRed.setLayoutY(10);
pbGreen.setLayoutY(30);

pbRed.setStyle("-fx-accent: red;");       // line (1)
pbGreen.setStyle("-fx-accent: green;");   // line (2)

root.getChildren().addAll(pbRed, pbGreen);
Scene scene = new Scene(root, 150, 50);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
}

我总是得到 2 个红色进度条!似乎第 (1) 行中的代码更改了 ProgressBar 类的样式,而不是实例。

另一个奇怪的时刻是删除第 (1) 行不会导致 2 个绿色进度条。所以我可以认为第 (2) 行完全没用!!为什么?!这肯定会变得很奇怪。

有没有办法为单独的进度条设置单独的颜色?

【问题讨论】:

    标签: colors progress-bar javafx-2


    【解决方案1】:

    您应该使用 JavaFX CSS 选择器覆盖(或自定义)样式。有关更多信息,请参阅 caspian.css。在您自己的样式表中定义:

    .progress-bar .bar {
        -fx-background-color:
            -fx-box-border,
            linear-gradient(to bottom, derive(-fx-accent,95%), derive(-fx-accent,10%)),
            red; /* this line is the background color of the bar */
        -fx-background-insets: 0, 1, 2;
        -fx-padding: 0.416667em; /* 5 */
    }
    

    【讨论】:

      【解决方案2】:

      答案已更新,添加了一个带有多个进度条的简单非动画示例

      您问题中的代码应该显示两个不同颜色的进度条,事实并非如此,这是 JavaFX css 处理系统中的一个错误。在此处记录针对运行时项目的错误:http://javafx-jira.kenai.com

      作为一种解决方法,不要在进度条上调用 setStyle,而是定义用于在样式表中为进度条着色的强调色并将样式类添加到进度条。然后,您可以在同一个应用程序中创建多个进度条,全部使用不同的颜色。

      正如 Uluk 指出的那样,您可以将 JavaFX 2.2 caspian.cssJavaFX 2 css reference guideJavaFX 2 css tutorial 结合使用来确定如何设置样式。

      这是一些示例代码,它根据这些参考资料中的信息自定义进度条。

      示例 css:

      /** progress.css
          place in same directory as 
          ColoredProgressBarStyleSheet.java or SimpleColoredProgressBar.java
          ensure build system copies the css file to the build output path */
      
      .root { -fx-background-color: cornsilk; -fx-padding: 15; }
      
      .progress-bar { -fx-box-border: goldenrod; }
      
      .green-bar  { -fx-accent: green;  }
      .yellow-bar { -fx-accent: yellow; }
      .orange-bar { -fx-accent: orange; }
      .red-bar    { -fx-accent: red;    }
      

      简单示例程序:

      import javafx.application.Application;
      import javafx.geometry.Pos;
      import javafx.scene.Scene;
      import javafx.scene.control.ProgressBar;
      import javafx.scene.layout.VBox;
      import javafx.stage.Stage;
      
      // shows multiple progress bars drawn in different colors.
      public class SimpleColoredProgressBar extends Application {
           public static void main(String[] args) { launch(args); }
      
           @Override public void start(Stage stage) {
               final VBox layout = new VBox(10);
               layout.setAlignment(Pos.CENTER);
               layout.getChildren().setAll(
                   new ColoredProgressBar("red-bar",    0.2),
                   new ColoredProgressBar("orange-bar", 0.4),
                   new ColoredProgressBar("yellow-bar", 0.6),
                   new ColoredProgressBar("green-bar",  0.8)
               );
               layout.getStylesheets().add(getClass().getResource("progress.css").toExternalForm());
               stage.setScene(new Scene(layout));
               stage.show();
          }
      
          class ColoredProgressBar extends ProgressBar {
              ColoredProgressBar(String styleClass, double progress) {
                  super(progress);
                  getStyleClass().add(styleClass);
              }
          }
      }
      

      简单示例程序输出:

      具有单个动画进度条的更复杂的示例程序,该进度条会根据所取得的进度量动态改变颜色:

      import javafx.animation.*;
      import javafx.application.Application;
      import javafx.beans.value.*;
      import javafx.event.*;
      import javafx.geometry.Pos;
      import javafx.scene.Scene;
      import javafx.scene.control.*;
      import javafx.scene.layout.VBox;
      import javafx.stage.Stage;
      import javafx.util.Duration;
      
      // shows a progress bar whose bar changes color depending on the amount of progress.
      public class ColoredProgressBarStyleSheet extends Application {
        public static void main(String[] args) { launch(args); }
      
        private static final String RED_BAR    = "red-bar";
        private static final String YELLOW_BAR = "yellow-bar";
        private static final String ORANGE_BAR = "orange-bar";
        private static final String GREEN_BAR  = "green-bar";
        private static final String[] barColorStyleClasses = { RED_BAR, ORANGE_BAR, YELLOW_BAR, GREEN_BAR };
      
        @Override public void start(Stage stage) {
          final ProgressBar bar = new ProgressBar();
      
          final Timeline timeline = new Timeline(
            new KeyFrame(Duration.millis(0),    new KeyValue(bar.progressProperty(), 0)),
            new KeyFrame(Duration.millis(3000), new KeyValue(bar.progressProperty(), 1))
          );
      
          Button reset = new Button("Reset");
          reset.setOnAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent event) {
              timeline.playFromStart();
            }
          });
      
          bar.progressProperty().addListener(new ChangeListener<Number>() {
            @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
              double progress = newValue == null ? 0 : newValue.doubleValue();
              if (progress < 0.2) {
                setBarStyleClass(bar, RED_BAR);
              } else if (progress < 0.4) {
                setBarStyleClass(bar, ORANGE_BAR);
              } else if (progress < 0.6) {
                setBarStyleClass(bar, YELLOW_BAR);
              } else {
                setBarStyleClass(bar, GREEN_BAR);
              }
            }
      
            private void setBarStyleClass(ProgressBar bar, String barStyleClass) {
              bar.getStyleClass().removeAll(barColorStyleClasses);
              bar.getStyleClass().add(barStyleClass);
            }
          });    
      
          final VBox layout = new VBox(10);
          layout.setAlignment(Pos.CENTER);
          layout.getChildren().setAll(bar, reset);
          layout.getStylesheets().add(getClass().getResource("progress.css").toExternalForm());
          stage.setScene(new Scene(layout));
          stage.show();
      
          timeline.play();
        }    
      }
      

      更复杂的示例程序输出:

      【讨论】:

      • 我知道了,我应该在 caspian.css 中进行一些静态更改,然后在我的程序中使用它。但我不能用你的代码动态生成新颜色。顺便说一句,谢谢,因为您表明 -fx-accent: xxx 是我所需要的。
      • 不,不要对 caspian.css 进行静态更改。 caspian.css 只是一个参考。使用答案中定义的用户样式表。
      • 更新了答案以添加一个额外的示例,该示例显示如何在单个应用程序中显示多个进度条,所有进度条都具有不同的颜色。
      • 谢谢,这绝对适用于样式表(我现在在我的程序中使用你的方案)。但我想扩展我关于动态颜色选择问题的问题。换句话说,如果我必须编写一个程序,让用户在 ColorChooser 中选择一种颜色并将其应用于进度条,该怎么办?
      【解决方案3】:

      对于那些想要一个简单答案(并且不需要添加 CSS 文件)的人:

      ProgressBar pbGreen = new ProgressBar(0.6);
      pbGreen.setStyle("-fx-accent: green");
      

      【讨论】:

      • 这当然是在 JavaFX 的最新版本中
      猜你喜欢
      • 2012-11-08
      • 2019-01-17
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2010-12-01
      • 2013-05-10
      相关资源
      最近更新 更多