实现依赖于上下文的MenuBar的惯用方法?

时间:2014-08-05 15:11:48

标签: javafx javafx-2

我定义了@FXML Menu editMenu,我希望根据我当前关注的TreeView中的哪一个以及是否选择了TreeItem来填充它

这样做的惯用方法是什么?我还没有为onFocus找到一个不错的TreeView方法。

谢谢!

1 个答案:

答案 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是场景图中的任何节点。