JavaFX MenuBar 为 JavaFX 应用程序提供了一个可视化的下拉菜单,类似于大多数桌面应用程序在其应用程序窗口的顶部。JavaFX MenuBar 为类 javafx.scene.control.MenuBar,下面是一个 JavaFX MenuBar 的截图示例:
MenuBar menuBar = new MenuBar();
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class JavaFXApp extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("JavaFX App");
MenuBar menuBar = new MenuBar();
VBox vBox = new VBox(menuBar);
Scene scene = new Scene(vBox, 960, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
}
注意如何将 MenuBar 添加到 JavaFX 场景的根布局(VBox)中。这将 MenuBar 置于应用程序窗口的顶部。请注意,上面的示例没有向 MenuBar 添加任何菜单或菜单项,因此如果运行该示例,实际上不会看到 MenuBar。我们将在下面的部分中看到如何添加菜单和菜单项。
创建 MenuBar 实例后,可以向其中添加 Menu 实例(javafx.scene.control.Menu)。Menu 实例表示具有嵌套菜单项的单个垂直菜单。因此,您可以向 MenuBar 添加多个 MenuBar 实例,以添加多个垂直下拉菜单。
Menu menu1 = new Menu("Menu 1");
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu1);
可以通过调用其 setGraphic ()方法为 Menu 设置图形图标。图形图标将显示在菜单的文本标签旁边。如下示例:
Menu menu = new Menu("Menu 1");
menu.setGraphic(new ImageView("file:volleyball.png"));
JavaFX Menu 常用的事件是:
当用鼠标点击一个菜单时,它会显示其内容。此操作在菜单开始显示其菜单项之前触发事件 onShowing。一旦菜单完全可见,就会触发 onShown 事件。
当用鼠标点击一个显示(打开)菜单时,它会再次隐藏其内容。此操作在菜单开始隐藏其菜单项之前触发 onHiding 事件。一旦菜单被完全隐藏,onHidden 事件就会被触发。
可以使用 setOnShowing ()、 setOnShown ()、 setOnHiding ()和 setOnHidden ()方法为上述事件设置 Menu 事件侦听器。如下示例:
Menu menu = new Menu("Menu 1");
menu.setOnShowing(e -> { System.out.println("Showing Menu 1"); });
menu.setOnShown (e -> { System.out.println("Shown Menu 1"); });
menu.setOnHiding (e -> { System.out.println("Hiding Menu 1"); });
menu.setOnHidden (e -> { System.out.println("Hidden Menu 1"); });
创建 Menu 实例后,必须向其添加一个或多个 MenuItem 实例。每个菜单项对应于它所添加到的菜单项中的菜单项。下面是一个向菜单添加2个 MenuItem 实例的例子,然后将其添加到 MenuBar:
Menu menu = new Menu("Menu 1");
MenuItem menuItem1 = new MenuItem("Item 1");
MenuItem menuItem2 = new MenuItem("Item 2");
menu.getItems().add(menuItem1);
menu.getItems().add(menuItem2);
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu);
您可以向菜单项添加图标。您可以通过调用 MenuItem 的 setGraphic ()方法将图形图标添加到 MenuItem 中,并将要用于给定 MenuItem 的图形作为参数传递。如下示例:
Menu menu = new Menu("Menu 1");
MenuItem menuItem1 = new MenuItem("Item 1");
menuItem1.setGraphic(new ImageView("file:soccer.png"));
MenuItem menuItem2 = new MenuItem("Item 2");
menuItem1.setGraphic(new ImageView("file:basketball.png"));
menu.getItems().add(menuItem1);
menu.getItems().add(menuItem2);
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu);
如果您选择任何菜单项,前面示例中创建的 MenuBar 配置将不起作用。为了响应 MenuItem 的选择,必须在 MenuItem 上设置事件监听器。下面是一个将事件监听器添加到 JavaFX MenuItem 的示例:
MenuItem menuItem1 = new MenuItem("Item 1");
menuItem1.setOnAction(e -> {
System.out.println("Menu Item 1 Selected");
});
JavaFX MenuBar 支持多层菜单。嵌套在另一个菜单中的菜单称为子菜单。Menu 类扩展 MenuItem 类,因此可以用作另一个 Menu 实例中的菜单项。下面是一个创建单个 JavaFX 菜单的例子,其中包含一个子菜单:
Menu menu = new Menu("Menu 1");
Menu subMenu = new Menu("Menu 1.1");
MenuItem menuItem11 = new MenuItem("Item 1.1.1");
subMenu.getItems().add(menuItem11);
menu.getItems().add(subMenu);
MenuItem menuItem1 = new MenuItem("Item 1");
menu.getItems().add(menuItem1);
MenuItem menuItem2 = new MenuItem("Item 2");
menu.getItems().add(menuItem2);
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu);
JavaFX MenuBar 支持在菜单中使用多选菜单项。多选菜单项是一个菜单项,它可以被“选中”并保持选中状态,直到以后没有被选中。只要选中菜单项,一个小的选中标记就会显示在该菜单项的旁边。
CheckMenuItem checkMenuItem = new CheckMenuItem("Check this!");
menu.getItems().add(checkMenuItem);
JavaFX MenuBar 还支持单选菜单项。单选菜单项是一组菜单项中只能选择其中一项的菜单项,就像标准的 JavaFX 单选按钮一样。
单选菜单项由 RadioMenuItem 表示。RadioMenuItem 实例必须添加到 ToggleGroup 中,以使它们相互排斥。这样 JavaFX 就可以知道哪个 RadioMenuItem 实例属于同一个实例。下面是一个使用一组单选菜单项的 JavaFx 菜单的例子:
Menu menu = new Menu("Menu 1");
RadioMenuItem choice1Item = new RadioMenuItem("Choice 1");
RadioMenuItem choice2Item = new RadioMenuItem("Choice 2");
RadioMenuItem choice3Item = new RadioMenuItem("Choice 3");
ToggleGroup toggleGroup = new ToggleGroup();
toggleGroup.getToggles().add(choice1Item);
toggleGroup.getToggles().add(choice2Item);
toggleGroup.getToggles().add(choice3Item);
menu.getItems().add(choice1Item);
menu.getItems().add(choice2Item);
menu.getItems().add(choice3Item);
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu);
MenuBar 支持菜单项分隔符。分隔符是分隔菜单项组的水平线。分隔符通常用于向用户显示哪些菜单项彼此相关。
菜单项分隔符由 SeparatorMenuItem 类表示。下面是一个菜单的例子,两个菜单项被一个分隔菜单分开:
MenuItem item1 = new MenuItem("Item 1");
MenuItem item2 = new MenuItem("Item 2");
SeparatorMenuItem separator = new SeparatorMenuItem();
menu.getItems().add(item1);
menu.getItems().add(separator);
menu.getItems().add(item2);
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu);
MenuBar 还支持使用自定义 JavaFX 控件作为菜单项。为此,您需要使用 CustomMenuItem (javafx.scene.control.CustomMenuItem)。
CustomMenuItem 类具有一个 setContent ()方法,您可以使用该方法设置要在菜单中显示的自定义 JavaFX 控件。下面的例子展示了一个 JavaFX Button 和一个 JavaFX Slider 作为自定义菜单项:
Menu menu = new Menu("Menu 1");
Slider slider = new Slider(0, 100, 50);
CustomMenuItem customMenuItem = new CustomMenuItem();
customMenuItem.setContent(slider);
customMenuItem.setHideOnClick(false);
menu.getItems().add(customMenuItem);
Button button = new Button("Custom Menu Item Button");
CustomMenuItem customMenuItem2 = new CustomMenuItem();
customMenuItem2.setContent(button);
customMenuItem2.setHideOnClick(false);
menu.getItems().add(customMenuItem2);
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu);
注意对 CustomMenuItem setHideOnClick ()的调用,其值为 false 作为参数。这样做是为了在用户与自定义菜单项控件交互时保持菜单打开。如果您将该值设置为 true,那么当用户第一次单击控件时,菜单将立即关闭,从而使进一步的交互变得不可能。对于普通菜单项,您实际上希望菜单立即关闭,但对于某些自定义菜单项,您可能不希望这样做。再次点击菜单标题,仍然可以关闭菜单。