从Listener访问userData

时间:2013-02-27 17:29:26

标签: javafx-2 javafx

当通过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的意思吗?

3 个答案:

答案 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)

我有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());
        }
    });