2016-04-27 69 views
0

如果JavaFX中節點的任何一個屬性(或甚至更好,來自特定GROUP的任何一個屬性)發生更改,是否有通知?JavaFX中的任何屬性更改時的通知

在此先感謝!

+0

向所有人添加相同的無效偵聽器? – Itai

+2

很難看到一個用例,它不涉及創建綁定到感興趣屬性的綁定。你究竟在做什麼? –

+0

@sillyfly 非常感謝。我會嘗試sillyfly的方法如下: property1..addListener((ObservableValue <?extends Object> observable,Object oldValue,Object newValue) - > { // doSomething();}); property2..addListener((ObservableValue <?extends Object> observable,Object oldValue,Object newValue) - > { // doSomething();}); –

回答

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,因此您可以通過向列表中添加元素來控制屬性集,而不是逐個添加偵聽器。

+0

您附加了聽衆,但您永遠不會分開他們...... – fabian

相關問題