我定义了@FXML Menu editMenu
,我希望根据我当前关注的TreeView
中的哪一个以及是否选择了TreeItem
来填充它
这样做的惯用方法是什么?我还没有为onFocus
找到一个不错的TreeView
方法。
谢谢!
答案 0 :(得分:3)
所有Node
都有focusedProperty()
,您可以使用focusOwner
注册听众。此外,Scene
具有您可以观察到的{{3}}属性。
所以你可以做点什么
scene.focusOwnerProperty().addListener(new ChangeListener<Node>() {
@Override
public void changed(ObservableValue<? extends Node> obs, Node oldFocusOwner, Node newFocusOwner) {
// update menu based on newFocusOwner
}
});
如果您正在使用FXML,则很难掌握控制器中的Scene
。您可能需要执行以下操作:
ChangeListener<Node> menuUpdater = new ChangeListener<Node>() {
@Override
public void changed(ObservableValue<? extends Node> obs, Node oldFocusOwner, Node newFocusOwner) {
// update menu based on newFocusOwner
}
};
someNode.sceneProperty().addListener(new ChangeListener<Scene>() {
@Override
public void changed(ObservableValue<? extends Scene> obs, Scene oldScene, Scene newScene) {
if (oldScene != null) {
oldScene.focusOwnerProperty().removeListener(menuUpdater);
}
if (newScene != null) {
newScene.focusOwnerProperty().addListener(menuUpdater);
}
}
});
其中someNode
是场景图中的任何节点。