如何侦听JavaFX节点上psuedo类中的更改

如何侦听JavaFX节点上psuedo类中的更改,java,javafx,javafx-8,Java,Javafx,Javafx 8,我假设我可以监听节点上的更改。getPseudoClassStates(),因为它属于observeSet类型,但是不会触发任何更改事件或失效 是否有其他方法可以侦听在节点上设置psuedo类的更改 public class PsuedoEvents extends Application { public static void main(String[] args) { launch(args); } @Override public vo

我假设我可以监听
节点上的更改。getPseudoClassStates()
,因为它属于
observeSet
类型,但是不会触发任何更改事件或失效

是否有其他方法可以侦听在节点上设置psuedo类的更改

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();
    }

}
公共类PsuedoEvents扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(Stage)引发异常{
纽扣马=新纽扣(“马”);
horse.getPseudoClassState().addListener(新的InvalizationListener()){
@凌驾
公共无效无效(可观察arg0){
系统输出打印项次(“无效”+arg0);
}
});
horse.getpseudoClassState().addListener(新的SetChangeListener()){
@凌驾

public void onChanged(Change我已设法识别问题…
getPseudoClassStates()
返回一个不可修改的包装

public final ObservableSet<PseudoClass> getPseudoClassStates() {
    return FXCollections.unmodifiableObservableSet(pseudoClassStates);
}

这对我来说很有用…试过JDK1.8.0_161和JDK9.0.1谢谢检查,我用的是9.0。4@James_D这真是令人毛骨悚然,JavaFX中似乎没有任何变化,集合包装器始终使用弱引用,但在9.0.4中的行为有所不同……也许GC实现发生了变化……GC将是我的下一个猜测。
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);
        }
    });