1

当此类userData元素通过Listener. 基本上,在 aObservableValue的实例中获取对 的“所有者”的引用ChangeListener

我认为这可以通过一个例子更好地证明:

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使用吗?

4

3 回答 3

1

使用关键字final

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

然后使用:

newBox.getUserData()
于 2013-02-27T19:08:46.207 回答
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());
        }
    });
}

我总是对更好的解决方案持开放态度,但与此同时,我希望这也能对某人有所帮助!

于 2013-02-27T19:12:23.907 回答
0

我有 and 的数组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());
        }
    });
于 2015-12-31T19:53:06.727 回答