任何属性更改时JavaFX中的通知

时间:2016-04-27 09:16:07

标签: javafx properties

如果JavaFX中某个节点属性的任何一个(甚至更好,特定GROUP中的任何一个)发生变化,是否有办法发出通知?

提前致谢!

1 个答案:

答案 0 :(得分:0)

实际上我也不知道你想做这样的事情的原因,但是如果你不想为每个房产重复自己,你可以这样做:

ObservableList<Property<?>> propList = FXCollections.observableArrayList();

private void doSomething(Observable observable){
    System.out.println("Handled" + observable.toString());
}

private void attachListener(Property<?> p){
    p.addListener(new InvalidationListener() {

        @Override
        public void invalidated(Observable observable) {
            doSomething(observable);

        }
    });
}

// In start, or whereever you want to add the properties
propList.addListener(new ListChangeListener<Property<?>>(){

    @Override
    public void onChanged(javafx.collections.ListChangeListener.Change<? extends Property<?>> change) {
        while(change.next()){
            if(change.wasAdded())
                for(Property<?> item : change.getAddedSubList()){attachListener(item);}
        }
    }

});

BooleanProperty a = new SimpleBooleanProperty(false); 
BooleanProperty b = new SimpleBooleanProperty(false);
IntegerProperty c = new SimpleIntegerProperty(1);

propList.addAll(a,b,c);

a.set(true);
a.set(false);
b.set(true);
c.set(2);

输出是:

HandledBooleanProperty [value: true]
HandledBooleanProperty [value: false]
HandledBooleanProperty [value: true]
HandledIntegerProperty [value: 2]

它的作用:

您将属性添加到ObservableList,当列表获得新元素时,您的处理程序将作为InvalidationListener附加,因此您可以通过向列表中添加元素来控制属性集,而不是逐个添加监听器。