如果JavaFX中某个节点属性的任何一个(甚至更好,特定GROUP中的任何一个)发生变化,是否有办法发出通知?
提前致谢!
答案 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
附加,因此您可以通过向列表中添加元素来控制属性集,而不是逐个添加监听器。