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

时间:2018-01-16 22:26:00

标签: java javafx javafx-8 fxml scenebuilder

我通过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">

由于

1 个答案:

答案 0 :(得分:3)

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

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

2-将Controller连接到您的FXML。您可以通过以下方式在场景构建器中执行此操作:

enter image description here

3-在Controller类中添加以下内容

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 属性,将fxml中的新项目添加到#<methodName>或在此实例中#addMenuItem

注意:如果您不想通过触发器添加菜单项,而是想在您的阶段(窗口)之前动态添加它们程序显示。您可以使用 initialize 方法执行此操作。为此,请以这种方式创建MyController类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);
    }
}