通过 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);
}
}
我通过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);
}
}