我们如何在FXML中定义上下文菜单?

时间:2018-11-20 13:55:48

标签: java javafx fxml

虽然我可以在不使用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的属性?

2 个答案:

答案 0 :(得分:1)

尝试通过contextMenu属性在相应的Node上下文中定义(无双关语:)

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

答案 1 :(得分:1)

尝试一下

runat="server"
<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>