JavaFX ProgressBar: как изменить цвет панели?

я пытаюсь изменить цвет панели в 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) совершенно бесполезна !! ЗАЧЕМ?! Тот'определенно становится странным.

Есть ли способ установить отдельные цвета для отдельных индикаторов?

Ответы на вопрос(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 */
}
Решение Вопроса

Ответ обновлен, чтобы добавить простой неанимированный пример с несколькими индикаторами выполнения

Код в вашем вопросе должен отображать два разноцветных индикатора выполнения, тот факт, что он неЭто ошибка в системе обработки JavaFX CSS. Зарегистрируйте ошибку в исполняемом проекте здесь:http://javafx-jira.kenai.com.

В качестве обходного пути, вместо вызова setStyle для индикаторов выполнения, определите цвета акцента, используемые для окрашивания индикаторов в таблице стилей, и добавьте класс стиля в индикаторы выполнения. Затем вы можете создать несколько индикаторов выполнения в одном приложении, все с разными цветами.

Как указывает Улук, вы можете использоватьJavaFX 2.2 caspian.css в сочетании сСправочное руководство по JavaFX 2 css иУчебник по JavaFX 2 css определить, как оформить вещи.

Вот пример кода, который настраивает индикатор выполнения на основе информации в этих ссылках.

Образец 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();
  }    
}
</number></actionevent>

Более сложный пример программы вывода:

 Chechulin20 нояб. 2012 г., 06:45
stackoverflow.com/q/13467259/1711975 - ссылка на новый вопрос
 Chechulin14 нояб. 2012 г., 06:45
как я понял, я должен сделать некоторые статические изменения в caspian.css и затем использовать их в своей программе. Но я могу'т динамически генерировать новый цвет с вашим кодом. Кстати, спасибо, потому что вы показали, что-fx-accent: xxx это то, что мне нужно
 jewelsea16 нояб. 2012 г., 23:17
Обновленный ответ для добавления дополнительного примера, который показывает, как отображать несколько индикаторов выполнения в одном приложении, все с разными цветами.
 Chechulin20 нояб. 2012 г., 06:34
Спасибо, это определенно работает с таблицами стилей (сейчас я использую вашу схему в моей программе). Но я хочу расширить мой вопрос о проблеме динамического выбора цвета. Другими словами, что если яДолжен ли я написать программу, в которой пользователь выбирает цвет в ColorChooser, и он должен быть применен к индикатору?
 jewelsea14 нояб. 2012 г., 19:18
Нет неt вносить статические изменения в caspian.css. caspian.css это просто ссылка. Используйте пользовательскую таблицу стилей, как определено в ответе.

Ваш ответ на вопрос