【问题标题】:How do we define the context menu in FXML?我们如何在 FXML 中定义上下文菜单?
【发布时间】:2018-11-20 13:55:48
【问题描述】:

虽然我可以在没有 FXML 的情况下定义 ContextMenu,但我找不到在 FXML 中定义上下文菜单的好方法:

在源文件中:

ContextMenu contextMenu = new ContextMenu();
contextMenu.getItems().addAll(someMenuItems);
// This runs perfectly

在 FXML 中:

<ContextMenu fx:id="contextMenu">
</ContextMenu>
// This is incorrect in fxml. The Exception of "Unable to coerce javafx.scene.control.ContextMenu to class javafx.scene.Node" is thrown.

<MenuBar fx:id="menuBar">
    //... Some Menu and items could be defined here
</MenuBar>
// This is correct in fxml

我知道 MenuBar 可以工作,因为它扩展了 javafx.scene.control.Control,它是 javafx.scene.Node 的子类,但 ContextMenu 没有。

那么有什么方法可以在 FXML 中类似地定义 ContextMenu 的属性吗?

【问题讨论】:

  • 我知道有些人更喜欢手动编码 FXML 而不是使用 Scene Builder,但如果不知道如何手动执行某些操作,那么只需使用 Scene Builder 进行该部分,然后查看 FXML 是如何生成的。

标签: java javafx fxml


【解决方案1】:

试试这个

<BorderPane fx:id="borderPane" fx:controller="sample.Controller" xmlns:fx="http://javafx.com/fxml">
    <fx:define>
        <ContextMenu fx:id="contextMenu">
            <items>
                <MenuItem text="Menu Item"/>
            </items>
        </ContextMenu>
    </fx:define>
</BorderPane>
public class Controller {

    @FXML
    private ContextMenu contextMenu;

    @FXML
    private BorderPane borderPane;

    @FXML
    private void initialize() {
        borderPane.setOnContextMenuRequested(event -> {
            contextMenu.show(borderPane, event.getScreenX(), event.getScreenY());
        });
    }
}

【讨论】:

  • 这个答案更多是关于“如何为任何不是控件的东西创建上下文菜单”,但幸运的是这正是我想要的 ;-) 谢谢
【解决方案2】:

尝试通过contextMenu 属性在相应的节点上下文中定义它(没有双关语:):

<TextField fx:id="tf">
    <contextMenu>
        <ContextMenu fx:id="cmTF">
            <items>
                <MenuItem text="Add"/>
                <MenuItem text="Remove"/>
                <MenuItem text="Enhance"/>
            </items>
        </ContextMenu>
    </contextMenu>
</TextField>

【讨论】:

  • 谢谢!我没有注意到 contextMenu 实际上是 Node 内部的一个属性!
  • @DauZi 仅适用于 Control 类型的 Node,否则应使用其他方法 here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多