これには、CSS based psuedo-classに基づいてプロパティを使用できます。
CSS psuedo-classがサポートするプロパティをモデルオブジェクトのプロパティにバインドすることができます。そのため、モデルを更新するときに、関連付けられたビューのCSS擬似クラスが自動的に変更され、必要に応じてビューが更新されます。
下の画像では、各円が電球を表しています。各バルブには、その状態を表す関連プロパティ(バルブがオンかどうかを示すBooleanProperty)があります。プロパティのinvalidated()
メソッドは、関連するCSS疑似クラス状態への変更の通知をトリガするために使用されます。この状態では、電球がオンになっているかどうかによって電球のスタイルが更新されます。
onProperty()
はバルブの公開されたプロパティであるため、モデルの適切なブール値プロパティにバインドできます。これは、チェックボックスやトグルボタンなど、JavaFX APIの他のCSS擬似クラスサポートコントロールがどのように機能するかについて、いくつかの点で同様の実装です。
bulb.css
.bulb {
-fx-fill: lightslategray;
}
.bulb:on {
-fx-fill: gold;
}
LightArray.java
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.css.PseudoClass;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class LightArray extends Application {
@Override
public void start(final Stage stage) throws Exception {
Bulb bulb1 = new Bulb();
Bulb bulb2 = new Bulb();
bulb2.setOn(true);
final HBox layout = new HBox(10, bulb1, bulb2);
layout.setPadding(new Insets(10));
Scene scene = new Scene(layout);
scene.getStylesheets().add(
this.getClass().getResource("bulb.css").toExternalForm()
);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
static private class Bulb extends Circle {
Bulb() {
super(30);
getStyleClass().add("bulb");
}
public void setOn(boolean on) {
this.on.set(on);
}
public boolean isOn() {
return on.get();
}
public BooleanProperty onProperty() {
return on;
}
public BooleanProperty on =
new BooleanPropertyBase(false) {
@Override protected void invalidated() {
pseudoClassStateChanged(ON_PSEUDO_CLASS, get());
}
@Override public Object getBean() {
return Bulb.this;
}
@Override public String getName() {
return "on";
}
};
private static final PseudoClass
ON_PSEUDO_CLASS = PseudoClass.getPseudoClass("on");
}
}
それはあなたのソリューションを消化するために私にしばらく時間がかかりました。それは多くの面で本当に素晴らしいです。私は特にサークルをカスタム "バルブ"コントロールに変えるのが好きです。これは、単純な「円」よりはるかにはっきりとした視点での役割を果たします。 – jhunovis