当通过userData
触发此元素时,我希望获得元素的Listener
。基本上,请参考"所有者"在ObservableValue
的实例中ChangeListener
。{/ p>
我认为通过一个例子可以更好地证明这一点:
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
的意思吗?
答案 0 :(得分:1)
使用关键字final
:
final CheckBox newBox = new CheckBox("My Label " + i);
然后使用:
进行访问newBox.getUserData()
答案 1 :(得分: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());
}
});
}
我总是愿意接受更好的解决方案,但与此同时,我希望这也可以帮助别人!
答案 2 :(得分:0)
我有CheckBoxes
和TextFields
的数组,都使用相同的侦听器,我使用userData
来判断哪个是:
cb.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent event) {
final CheckBox source = (CheckBox) event.getSource();
System.out.println(source.getUserData());
}
});