如何在 JavaFX 节点上监听 psuedo-类 的变化
How to listen to changes in psuedo-classes on JavaFX nodes
我曾假设我可以在 Node.getPseudoClassStates()
上监听更改,因为它是类型 ObservableSet
,但是没有触发更改事件或失效。
有没有其他方法可以监听在节点上设置伪类的变化
public class PsuedoEvents extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Button horse = new Button("horse");
horse.getPseudoClassStates().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable arg0) {
System.out.println("invalidated " + arg0);
}
});
horse.getPseudoClassStates().addListener(new SetChangeListener<>() {
@Override
public void onChanged(Change<? extends PseudoClass> arg0) {
System.out.println("changed " + arg0);
}
});
stage.setScene(new Scene(new HBox(horse), 300, 300));
PseudoClass fooClass = PseudoClass.getPseudoClass("foo");
horse.setOnAction(event -> {
horse.pseudoClassStateChanged(fooClass, !horse.getPseudoClassStates().contains(fooClass));
System.out.println("Toggle state... " + horse.getPseudoClassStates());
});
stage.show();
}
}
我已经设法找出问题...getPseudoClassStates()
returns 一个不可修改的包装器。
public final ObservableSet<PseudoClass> getPseudoClassStates() {
return FXCollections.unmodifiableObservableSet(pseudoClassStates);
}
包装器类型 UnmodifiableObservableSet
使用弱侦听器来跟踪支持列表,但是由于没有对包装器的强引用,因此它被垃圾收集。
我可以使用
解决这个问题
private ObservableSet<PseudoClass> states; // <=== strong ref
@Override
public void start(Stage stage) throws Exception {
Button horse = new Button("horse");
states = horse.getPseudoClassStates();
states.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable arg0) {
System.out.println("invalidated " + arg0);
}
});
我曾假设我可以在 Node.getPseudoClassStates()
上监听更改,因为它是类型 ObservableSet
,但是没有触发更改事件或失效。
有没有其他方法可以监听在节点上设置伪类的变化
public class PsuedoEvents extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Button horse = new Button("horse");
horse.getPseudoClassStates().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable arg0) {
System.out.println("invalidated " + arg0);
}
});
horse.getPseudoClassStates().addListener(new SetChangeListener<>() {
@Override
public void onChanged(Change<? extends PseudoClass> arg0) {
System.out.println("changed " + arg0);
}
});
stage.setScene(new Scene(new HBox(horse), 300, 300));
PseudoClass fooClass = PseudoClass.getPseudoClass("foo");
horse.setOnAction(event -> {
horse.pseudoClassStateChanged(fooClass, !horse.getPseudoClassStates().contains(fooClass));
System.out.println("Toggle state... " + horse.getPseudoClassStates());
});
stage.show();
}
}
我已经设法找出问题...getPseudoClassStates()
returns 一个不可修改的包装器。
public final ObservableSet<PseudoClass> getPseudoClassStates() {
return FXCollections.unmodifiableObservableSet(pseudoClassStates);
}
包装器类型 UnmodifiableObservableSet
使用弱侦听器来跟踪支持列表,但是由于没有对包装器的强引用,因此它被垃圾收集。
我可以使用
解决这个问题private ObservableSet<PseudoClass> states; // <=== strong ref
@Override
public void start(Stage stage) throws Exception {
Button horse = new Button("horse");
states = horse.getPseudoClassStates();
states.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable arg0) {
System.out.println("invalidated " + arg0);
}
});