Colors JavaFXProgressBar:如何更改工具栏颜色?

Colors JavaFXProgressBar:如何更改工具栏颜色?,colors,progress-bar,javafx-2,Colors,Progress Bar,Javafx 2,我正在尝试用更改ProgressBar中条形图的颜色 pBar.setStyle("-fx-accent: green"); 但我遇到了一个问题:这似乎不适合我!(或者我就是不明白) 代码如下: public class JavaFXApplication36 extends Application { @Override public void start(Stage primaryStage) { AnchorPane root = new AnchorPane(); ProgressB

我正在尝试用更改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();
}
}
我总是用它得到两个红色的进度条!第(1)行中的代码似乎改变了ProgressBar类的样式,而不是实例

另一个奇怪的时刻是,删除第(1)行不会产生两个绿色进度条。所以我认为第(2)行是完全无用的!!为什么?这真是太奇怪了

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

您应该使用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 */
}
答案已更新,添加了一个带有多个进度条的简单非动画示例

您的问题中的代码应该显示两个不同颜色的进度条,事实上,这不是JavaFXCSS处理系统中的一个bug。在此处针对运行时项目记录错误:

作为一种解决方法,与其在进度条上调用setStyle,不如定义样式表中用于为进度条着色的强调色,并向进度条添加样式类。然后,您可以在同一个应用程序中创建多个进度条,所有进度条都具有不同的颜色

正如Uluk指出的,您可以与和结合使用来确定如何设置样式

下面是一些基于这些引用中的信息定制进度条的示例代码

示例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();
  }    
}
导入javafx.animation.*;
导入javafx.application.application;
导入javafx.beans.value.*;
导入javafx.event.*;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
导入javafx.util.Duration;
//显示一个进度条,其进度条的颜色随进度的大小而变化。
公共类ColoredProgressBarStyleSheet扩展了应用程序{
公共静态void main(字符串[]args){launch(args);}
私有静态最终字符串RED_BAR=“RED BAR”;
私有静态最终字符串黄色\ u BAR=“黄色条”;
私有静态最终字符串ORANGE\u BAR=“ORANGE BAR”;
私有静态最终字符串绿色\ u BAR=“绿色栏”;
私有静态最终字符串[]barColorStyleClasses={红色、橙色、黄色、绿色};
@覆盖公共无效开始(阶段){
最终进度条=新进度条();
最终时间线=新时间线(
新的关键帧(Duration.millis(0),新的KeyValue(bar.progressProperty(),0)),
新关键帧(Duration.millis(3000),新键值(bar.progressProperty(),1))
);
按钮重置=新按钮(“重置”);
setOnAction(新的EventHandler(){
@重写公共无效句柄(ActionEvent事件){
timeline.playFromStart();
}
});
bar.progressProperty().addListener(新的ChangeListener()){

@Override public void changed(ObservalEvalue适用于需要简单答案(且无需添加CSS文件)的用户:

ProgressBar pbGreen=新的ProgressBar(0.6);
pbGreen.setStyle(“-fx重音:绿色”);

当我得到它时,我应该在caspian.css中做一些静态更改,然后在我的程序中使用它。但是我不能用你的代码动态生成新的颜色。顺便说一句,谢谢,因为你显示了-fx口音:xxx是我需要的。不,不要对caspian.css进行静态更改。caspian.css只是一个参考。请使用a中定义的用户样式表更新的答案添加了一个额外的示例,演示了如何在一个应用程序中显示多个进度条,所有进度条都有不同的颜色。谢谢,这肯定适用于样式表(我现在在我的程序中使用您的方案)。但我想扩展我关于动态颜色选择问题的问题。换句话说,如果我必须编写一个程序,让用户在ColorChooser中选择一种颜色,并将其应用到进度栏,该怎么办?当然,这是在JavaFX的最新版本中