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

aje*_*jeh 4 javafx

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

jew*_*sea 5

FXML如何工作

FXML通过使用反射(或使用专门的构建器类)对Java API进行内省来工作.有关FXML工作的更多信息,请参阅FXML文档简介.

为什么无法使用FXML标记在JavaFX中的Panes上定义ContextMenus

Control具有contextMenu属性.甲的ScrollPane是一个控制.其他窗格类型(如StackPane)不是控件.由于这些其他窗格类型中没有相应的属性可以设置为包含对contextMenu的引用,因此无法使用FXML在这些窗格类型上定义contextMenu.

出于类似的原因,您无法在窗格上定义工具提示.

如何在FXML控制器中为窗格定义ContextMenu

您仍然可以使用contextMenu show API 通过代码在窗格(以及任何其他不是控件的任意节点)上设置上下文菜单,例如将以下代码放在FXML控制器中.

@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()
            );
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

为什么不添加ContextMenu属性

Node可以有一个contextMenu属性,它允许通过FXML标记在Panes上定义ContextMenus.

Node之所以没有contextMenu属性但是Control的原因是因为ContextMenu本身就是一个Control.向节点添加ContextMenu属性意味着JavaFX实现的核心场景图模型代码将依赖于控件模块(这将依赖于场景图模块),因此是循环依赖.这将阻止包含核心JavaFX场景图和渲染引擎的非常轻的Java运行时系统的运送,但不包括控件(不是今天任何人都有这样的系统).

如何归档功能请求

如果您认为应该更改系统以允许使用SceneBuilder在任意窗格上定义上下文菜单,那么您可以针对JavaFX问题跟踪器提交功能请求(如果您这样做,请在功能请求中包含回到此问题的链接) .