1. ホーム
  2. css

[解決済み] JavaFX Labelの文字色を変更する方法

2022-02-14 14:42:15

質問

JavaFXのラベルクラス内にあるテキストの色を変更するのに苦労しています。

これは私が今までに持っているコードです。

package Problem2;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Problem2Code extends Application {

Slider[] slider = new Slider[4];
@Override
public void start(Stage primaryStage) throws Exception {

    Text text = new Text("Show Colors");

    // Bottom pane
    Label[] labels = new Label[4];
    String[] stringLabels = {"Red", "Green", "Blue", "Opacity"};

    GridPane gridPane = new GridPane();
    gridPane.setHgap(30);
    gridPane.setVgap(5);
    gridPane.setPadding(new Insets(25));

    gridPane.setAlignment(Pos.CENTER);
    for (int i = 0; i < slider.length; i++) {
        slider[i] = new Slider();
        slider[i].setMin(0);
        if (!stringLabels[i].equals("Opacity")) {
            slider[i].setMax(255);
            slider[i].setValue(255);
        } else {
            slider[i].setMax(1);
            slider[i].setValue(1);
        }
        labels[i] = new Label(stringLabels[i]);
        slider[i].valueProperty()
                .addListener((obser, old, newV) -> text.setFill(getColor()));

        gridPane.add(labels[i], 0, i);
        gridPane.add(slider[i], 1, i);

    }
    StackPane stackPane = new StackPane(text);
    stackPane.setPrefSize(315, 65);
    BorderPane borderPane = new BorderPane(stackPane);
    borderPane.setBottom(gridPane);

    primaryStage.setScene(new Scene(borderPane));
    primaryStage.setTitle("Color Changer");
    primaryStage.show();
}

private Color getColor() {
    // r g b o
    double[] rgb = new double[4];
    for (int i = 0; i < rgb.length; i++) {
        rgb[i] = slider[i].getValue();
    }
    return Color.rgb((int)rgb[0], (int)rgb[1], (int)rgb[2], rgb[3]);
}
public static void main(String[] args) {
    Application.launch(args);
}}

組み立ててスライダーを弄ると、こんな感じです。

赤、緑、青の文字色を編集して、このような文字色にするにはどうしたらよいですか?

HBoxを作ることと関係があるのでは?それでやってみたのですが、正しいやり方が分かりませんでした。また、文字列ごとにstringLabels1, stringLabels2, stringLabels3, stringLabels4という変数を作ってみましたが、gridPaneの部分でうまくいきません。いずれもコーディングに苦労しています。

助けてください、よろしくお願いします。

解決方法は?

を使用することができます。 カラー#web メソッドを使用します。

for (int i = 0; i < slider.length; i++) {
    slider[i] = new Slider();
    slider[i].setMin(0);
    labels[i] = new Label(stringLabels[i]);
    if (!stringLabels[i].equals("Opacity")) {
        slider[i].setMax(255);
        slider[i].setValue(255);
        labels[i].setTextFill(Color.web(stringLabels[i])); //css alternative: labels[i].setStyle("-fx-text-fill: " + stringLabels[i]);
    } else {
        slider[i].setMax(1);
        slider[i].setValue(1);
    }

    slider[i].valueProperty()
            .addListener((obser, old, newV) -> text.setFill(getColor()));

    gridPane.add(labels[i], 0, i);
    gridPane.add(slider[i], 1, i);
}


余談:4つのスライダーすべてに1つのリスナーを使用することもできます。

ChangeListener<Number> listener = (obser, old, newV) -> text.setFill(getColor());

for (int i = 0; i < slider.length; i++) {
     ..
     slider[i].valueProperty().addListener(listener);
     ..
}