javafx - JavaFX FXML 模式不支持 Pane 内的上下文菜单的理由是什么?

标签 javafx

可以将上下文菜单添加到滚动 Pane ,但不能添加到其他类型的 Pane 。为什么?

最佳答案

FXML 的工作原理

FXML 通过使用反射(或使用专门的构建器类)对 Java API 进行内省(introspection)来工作。有关 FXML 作品的更多信息,请访问 Introduction to FXML。文档。

为什么不能使用 FXML 标记在 JavaFX 中的 Pane 上定义 ContextMenus

控件有 contextMenu property .一个 ScrollPane是一个控件。其他 Pane 类型,例如 StackPane不是控件。由于在这些其他 Pane 类型中没有相应的属性可以设置为包含对 contextMenu 的引用,因此您无法使用 FXML 在这些 Pane 类型上定义 contextMenu。

出于类似的原因,您也不能在 Pane 上定义工具提示。

如何为 FXML Controller 中的 Pane 定义 ContextMenu

您仍然可以使用 contextMenu show 通过代码在 Pane (以及任何其他非控件的任意节点)上设置上下文菜单API,例如通过将以下代码放置在您的 FXML Controller 中。

@FXML StackPane stack;

// . . .

public void initialize() {
    final ContextMenu contextMenu = new ContextMenu(new MenuItem("xyzzy"));
    stack.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            contextMenu.show(
                    stack,
                    mouseEvent.getScreenX(), 
                    mouseEvent.getScreenY()
            );
        }
    });
}

为什么不添加 ContextMenu 属性

节点可以有一个 contextMenu 属性,这将允许通过 FXML 标记在 Pane 上定义 ContextMenus。

原因Node没有 contextMenu 属性,但 Control 确实是因为 ContextMenu 本身就是一个控件。将 ContextMenu 属性添加到节点意味着 JavaFX 实现的核心场景图模型代码将依赖于控制模块(它将依赖于场景图模块),因此是循环依赖。这将阻止发布包含核心 JavaFX 场景图和渲染引擎但不包含控件的非常轻量级的 Java 运行时系统(不是今天有人发布这样的系统)。

如何提交功能请求

如果您认为应该更改系统以允许使用 SceneBuilder 在任意 Pane 上定义上下文菜单,那么您可以 file a feature request against the JavaFX issue tracker (如果您这样做,请在功能请求中包含返回此问题的链接)。

关于javafx - JavaFX FXML 模式不支持 Pane 内的上下文菜单的理由是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19525512/

相关文章:

java - JavaFX 中的一个 ListView 中的 2 个不同列表除以 header

java - 如何在 javafx WebView 中指定默认字体与默认 UI 字体相同

java - 将 JavaFX ContextMenu 置于屏幕中央?

java - 在新值(value)出现之前先弄清楚科学按钮

JavaFX - 无法在 ChoiceBox 上调用 setOnAction()?

java - 将数据库中的值填充到 javafx 中的 ObservableList

javafx - 将项目从 TreeView 拖放到文本区域中

java - 如何在 DefaultButton 操作之前使用 KeyPressed 事件?

svg - JavaFX 2.2中的SVG镜像

java - 我看不到 TableView 的元素 - JavaFX