通过 JavaFX 将子菜单动态添加到 FXML

Adding sub-menu dynamically to FXML via JavaFX

我通过Scene Builder制作了一个GUI界面。我想动态地将子节点添加到我的菜单中。

FXML 代码示例:

<MenuBar VBox.vgrow="NEVER">
            <menus>
                <Menu mnemonicParsing="false" text="File">
                    <items>
                        <MenuItem mnemonicParsing="false" onAction="#handleCreateNew" text="New" />
                        <MenuItem mnemonicParsing="false" onAction="#handleOpen" text="Open…" />
                        <Menu fx:id="openRecentTab" mnemonicParsing="false" onAction="#handleOpenRecentAction" text="Open Recent">
                            <items>
                                <MenuItem mnemonicParsing="false" text="" />
                                <MenuItem mnemonicParsing="false" text="" />
                                <MenuItem mnemonicParsing="false" text="" />
                            </items>
                        </Menu>
                        <SeparatorMenuItem mnemonicParsing="false" />
                        <MenuItem mnemonicParsing="false" onAction="#handleFileClose" text="Close" />
                        <MenuItem mnemonicParsing="false" onAction="#handleSave" text="Save" />
                        <MenuItem mnemonicParsing="false" onAction="#handleSaveAs" text="Save As…" />
                        <SeparatorMenuItem mnemonicParsing="false" />
                        <MenuItem mnemonicParsing="false" onAction="#handleQuit" text="Quit" />
                    </items>
                </Menu>
            </menus>
        </MenuBar>

我想更改或添加新的 <MenuItem> 到我的 <Menu fx:id="openRecentTab" mnemonicParsing="false" onAction="#handleOpenRecentAction" text="Open Recent">

谢谢

我假设您已将控制器与 FXML 文件链接,因为您已在其中定义了 onAction 触发器。但是,如果你还没有。

1- 创建一个新的 java 文件作为 FXML 的 控制器 并将其放在与 FXML 文件相同的包中。假设您将 class MyController.

命名为

2- Link 该控制器到您的 FXML。您可以通过这种方式在场景生成器中执行此操作:

3- 在您的控制器中 class 添加以下内容

public class MyController {

    @FXML private Menu openRecentTab;

    @FXML public void addMenuItem() {
        MenuItem menuItem1 = new MenuItem("Menu Item 1");
        MenuItem menuItem2 = new MenuItem("Menu Item 2");    
        MenuItem menuItem3 = new MenuItem("Menu Item 3");

        // Add multiple items at once
        openRecentTab.getItems().addAll(menuItem1, menuItem2);
        // Add one item
        openRecentTab.getItems().add(menuItem3);
    }
}

4- 您可以将 addMenuItem 方法设置为在例如单击某个按钮时调用。为此,将要触发的按钮的 onAction 属性设置为 #<methodName> 或在本例中 #addMenuItem

注意:如果您不想通过触发器添加菜单项,而是想在 stage(window) 显示您的程序。您可以使用 initialize 方法来执行此操作。为此,以这种方式使您的 MyController class implements Initializable

public class MyController implements Initializable{

    @FXML private Menu openRecentTab;

    // This method is called before the stage is shown
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        MenuItem menuItem1 = new MenuItem("Menu Item 1");
        MenuItem menuItem2 = new MenuItem("Menu Item 2");
        openRecentTab.getItems().addAll(menuItem1, menuItem2);
    }
}