これはバスの座席を描くための私のコードです。各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;
}
この機能をすでに実装しているクラスを使用して、スタイルシートを使用する方が簡単です。 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());
.toggle-button {
-fx-background-color: green;
}
.toggle-button:selected {
-fx-background-color: yellow;
}
ところで:あなたのコードの問題はおそらくボタンを保存するためにフィールド(seat
)を使用していることです。このようにanyボタンを押すと、最後に作成されたものが常に変更されたものになります。実装を使い続けたい場合は、代わりに内部ループで宣言されたfinal
ローカル変数を使用してください。
動的スタイルに関する私のアドバイスは、カスタム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;
}