2013-02-27 40 views
1

我期望通過Listener觸發此元素時獲得元素的userData。基本上,請參考ObservableValue的「所有者」,例如ChangeListener從Listener訪問userData

,我認爲這可以通過一個例子來證明更好:

for(/*something*/) { 
    CheckBox newBox = new CheckBox("My Label " + i); 
    newBox.setSelected(true); 
    newBox.setUserData(object); //setting this object to access later 
    newBox.selectedProperty().addListener(new ChangeListener<Boolean>() { 
     public void changed(ObservableValue<? extends Boolean> ov, Boolean old_val, Boolean new_val) { 
      //Here I would like to call something to get the UserData 
      //I have just set. I would need to access "object" set above. 
     } 
    }); 
} 

我還沒有找到一種方法來做到這一點。此刻,我可以設置此複選框的id並使用該ID去查找我需要的項目,但這似乎違背了我可以將對象(userData)設置到此節點的事實。這不是如何使用userData

回答

1

使用關鍵字final

final CheckBox newBox = new CheckBox("My Label " + i); 

然後使用訪問:

newBox.getUserData() 
+0

哇。我的解決方案要簡單得多......我想我需要回到書籍上去,然後回去幾步。 「最後」,這就是我需要的。知道它必須更簡單,然後我認爲 – blo0p3r 2013-02-27 19:26:16

+0

是的,關於最終的是有點棘手的事情,並不是每本書都對這種情況給予適當的關注。 – 2013-02-27 19:42:54

0

這裏是我發現這個問題的解決方案(假設我本來要求是不可能的)。

我最終創建了實現此功能的ChangeListener的實現。這Listener看起來是這樣的:那麼

public class ChangeListenerWithData implements ChangeListener<Boolean> { 

    private Object userData; 

    public ChangeListenerWithData(Node node) { 
     userData = node.getUserData(); 
    } 

    public Object getUserData() { 
     return userData; 
    } 

    public void setUserData(Object userData) { 
     this.userData = userData; 
    } 

    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, 
      Boolean oldValue, Boolean newValue) { 
     // TODO Auto-generated method stub 

    } 

} 

我的代碼已經成爲:

for(/*something*/) { 
    CheckBox newBox = new CheckBox("My Label " + i); 
    newBox.setSelected(true); 
    newBox.setUserData(object); //setting this object to access later 
    newBox.selectedProperty().addListener(new ChangeListenerWithData(newBox) { 
     public void changed(ObservableValue<? extends Boolean> ov, Boolean old_val, Boolean new_val) { 
      //accessing user data 
      context.getMyMap().get(this.getUserData().toString()); 
     } 
    }); 
} 

我總是開到更好的解決方案,但在此期間,我希望這可以幫助別人的!

0

我必須使用相同的聽衆CheckBoxesTextFields,所有的數組,我用userData分辨哪個是:

cb.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(final ActionEvent event) { 
     final CheckBox source = (CheckBox) event.getSource(); 
     System.out.println(source.getUserData()); 
     } 
    });