web-dev-qa-db-ja.com

javafxでのボタンの色の変更

これはバスの座席を描くための私のコードです。各Buttonは、GridPaneに描かれた座席を表します。誰かがシートをクリックしたときに、シートの色を緑から黄色に変更したい。これまで私はこれを行いました。ボタンをクリックすると、出力ウィンドウに「hellowworld」と出力されます。ただし、UIではボタンの色は変わりません。これが私のコードです:

public static GridPane drawBus(int rows, int col, String ss){
    GridPane table = new GridPane();
    table.setHgap(5);
    table.setVgap(5);
    table.setAlignment(Pos.CENTER);
    String seatName;

    if(ss.equals("ROW WISE")||ss.equals("Row Wise")||ss.equals("row wise")){
    for(int i=0; i<rows; i++){

        for(int j=0;j<col; j++)
        {
        seat=new Button();
        seat.setAlignment(Pos.CENTER);
        seat.setPrefSize(80, 31);

        seatName=numToString(i+1)+(j+1);
        seat.setText(seatName);
        seat.setStyle("-fx-background-color: MediumSeaGreen");


        seat.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {

            seat.setStyle("-fx-background-color: Yellow");
            System.out.println("Hello World!");

        }
        });

        busSeatList.put(seatName, 0);

        //add them to the GridPane
        table.add(seat, j, i); //  (child, columnIndex, rowIndex)

     }


    }
    }
    else
    {
      for(int i=0; i<rows; i++){

        for(int j=0;j<col; j++)
        {
        seat=new Button();
        seat.setAlignment(Pos.CENTER);
        seat.setPrefSize(80, 31);

        seatName=(i+1)+numToString(j+1);
        seat.setText(seatName);
        seat.setStyle("-fx-background-color: MediumSeaGreen");


        seat.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello World!");
            //seat.setStyle("-fx-background-color: Yellow");

        }
        });



        busSeatList.put(seatName, 0);
        //add them to the GridPane
        table.add(seat, j, i); //  (child, columnIndex, rowIndex)


       }


    }


    }


    return table;
}
2
Waliur Rahman

この機能をすでに実装しているクラスを使用して、スタイルシートを使用する方が簡単です。 ToggleButtonは、ニーズに合ったクラスです。

ToggleButton btn = new ToggleButton("Say 'Hello World'");
btn.setOnAction((ActionEvent event) -> {
    System.out.println("Hello World!");
});

...
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());

style.css

.toggle-button {
    -fx-background-color: green;
}

.toggle-button:selected {
    -fx-background-color: yellow;
}

ところで:あなたのコードの問題はおそらくボタンを保存するためにフィールド(seat)を使用していることです。このようにanyボタンを押すと、最後に作成されたものが常に変更されたものになります。実装を使い続けたい場合は、代わりに内部ループで宣言されたfinalローカル変数を使用してください。

0
fabian

動的スタイルに関する私のアドバイスは、カスタムPseudoClassとcssを使用することです。

コード内の疑似クラス:

public static final PseudoClass PSEUDO_CLASS_FOO = PseudoClass.getPseudoClass("foo");

// ... then in your creation method
// Note using Java8 lambda is more concise:
seat.setOnAction(event->{
        System.out.println("Hello World!");
       seat.pseudoClassStateChanged(PSEUDO_CLASS_FOO, true);

    });

あなたのCSSで:

Button:foo {
    -fx-background-color: yellow;
}
0
pdem