我通过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">
由于
答案 0 :(得分:3)
我假设您已将控制器与FXML文件链接,因为您已在其中定义了onAction触发器。但是如果你还没有。
1-创建一个新的java文件,它将作为FXML的控制器,并将其放在与FXML文件相同的包中。假设您将该类命名为 MyController 。
2-将Controller连接到您的FXML。您可以通过以下方式在场景构建器中执行此操作:
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);
}
}