2

このスレッドの色付きの進行状況バーで問題を解決しようとしていました。解決策はありましたが、別の問題に遭遇しました。コードから動的に色を変更できません。定義済みの .css ではなく、自分のコードから直接実行したい。通常はできますが、複数のプログレス バーで実行しようとすると、いくつかの問題が発生します。

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 つの奇妙な点は、行 (1) を削除しても 2 つの緑色の進行状況バーが表示されないことです。したがって、(2)行はまったく役に立たないとわかります!! どうして?!それは間違いなく奇妙になっています。

別々のプログレスバーに異なる色を設定する方法はありますか?

4

1 に答える 1

4

StackOverflow JavaFX ProgressBar コミュニティ Wikiも参照してください。


質問のサンプル コードを修正するためのバグが提出され、修正されるまで、使用できる回避策があります。

この回答のコードは、コンテンツに対してノード ルックアップProgressBarを実行し、プログレス バーのバーの色を任意の値に動的に変更します。

import javafx.application.Application;
import javafx.beans.value.*;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class ProgressBarDynamicColor extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage stage) {
    PickedColorBar aquaBar = new PickedColorBar(0.4, Color.AQUA);
    PickedColorBar fireBar = new PickedColorBar(0.6, Color.FIREBRICK);

    HBox layout = new HBox(20);
    layout.getChildren().setAll(aquaBar, fireBar);
    layout.setStyle("-fx-background-color: -fx-box-border, cornsilk; -fx-padding: 15;");

    stage.setScene(new Scene(layout));
    stage.show();

    aquaBar.wasShown();
    fireBar.wasShown();
  }

  class PickedColorBar extends VBox {
    private final ProgressBar bar;
    private final ColorPicker picker;

    private boolean wasShownCalled = false;

    final ChangeListener<Color> COLOR_LISTENER = new ChangeListener<Color>() {
      @Override public void changed(ObservableValue<? extends Color> value, Color oldColor, Color newColor) {
        setBarColor(bar, newColor);
      }
    };

    public PickedColorBar(double progress, Color initColor) {
      bar    = new ProgressBar(progress);
      picker = new ColorPicker(initColor);

      setSpacing(10);
      setAlignment(Pos.CENTER);
      getChildren().setAll(bar, picker);
    }

    // invoke only after the progress bar has been shown on a stage.     
    public void wasShown() {
      if (!wasShownCalled) {
        wasShownCalled = true;
        setBarColor(bar, picker.getValue());
        picker.valueProperty().addListener(COLOR_LISTENER);
      }  
    }

    private void setBarColor(ProgressBar bar, Color newColor) {
      bar.lookup(".bar").setStyle("-fx-background-color: -fx-box-border, " + createGradientAttributeValue(newColor));
    }

    private String createGradientAttributeValue(Color newColor) {
      String hsbAttribute = createHsbAttributeValue(newColor);
      return "linear-gradient(to bottom, derive(" + hsbAttribute+ ",30%) 5%, derive(" + hsbAttribute + ",-17%))";
    }

    private String createHsbAttributeValue(Color newColor) {
      return 
        "hsb(" + 
          (int)  newColor.getHue()               + "," + 
          (int) (newColor.getSaturation() * 100) + "%," + 
          (int) (newColor.getBrightness() * 100) + "%)";
    }
  }
}

このコードは、css 属性のインライン文字列処理を使用して、領域の背景を操作します。将来の JavaFX バージョン (JDK8+ など) には、バックグラウンド属性を操作するためのパブリック Java API が含まれ、Java プログラムからの属性の文字列処理が廃止されます。

プログラム出力の例:

colorchooser進行状況

于 2012-11-21T01:18:51.157 に答える