菜单是桌面应用程序选择选项的标准方法。
菜单和菜单项可以与选择选项快捷键组合,称为键盘快捷键。
必须创建一个菜单栏javafx.scene.control.MenuBar
对象来保存javafx.scene.control.Menu
对象。
菜单对象可以包含Menu
和javafx.scene.control.MenuItem
对象。菜单可以包含其他菜单作为子菜单。MenuItems
是Menu
对象内的子选项。
以下代码显示如何创建菜单栏并添加菜单和菜单项。
Menu
类是MenuItem
的子类,它有一个getItems().add()
方法,它能够添加诸如其他Menu
和MenuItem
实例的子元素。
import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.RadioMenuItem; import javafx.scene.control.SeparatorMenuItem; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) { BorderPane root = new BorderPane(); Scene scene = new Scene(root, 300, 250, Color.WHITE); MenuBar menuBar = new MenuBar(); menuBar.prefWidthProperty().bind(primaryStage.widthProperty()); root.setTop(menuBar); // File menu - new, save, exit Menu fileMenu = new Menu("File"); MenuItem newMenuItem = new MenuItem("New"); MenuItem saveMenuItem = new MenuItem("Save"); MenuItem exitMenuItem = new MenuItem("Exit"); exitMenuItem.setOnAction(actionEvent -> Platform.exit()); fileMenu.getItems().addAll(newMenuItem, saveMenuItem, new SeparatorMenuItem(), exitMenuItem); Menu webMenu = new Menu("Web"); CheckMenuItem htmlMenuItem = new CheckMenuItem("HTML"); htmlMenuItem.setSelected(true); webMenu.getItems().add(htmlMenuItem); CheckMenuItem cssMenuItem = new CheckMenuItem("CSS"); cssMenuItem.setSelected(true); webMenu.getItems().add(cssMenuItem); Menu sqlMenu = new Menu("SQL"); ToggleGroup tGroup = new ToggleGroup(); RadioMenuItem mysqlItem = new RadioMenuItem("MySQL"); mysqlItem.setToggleGroup(tGroup); RadioMenuItem oracleItem = new RadioMenuItem("Oracle"); oracleItem.setToggleGroup(tGroup); oracleItem.setSelected(true); sqlMenu.getItems().addAll(mysqlItem, oracleItem, new SeparatorMenuItem()); Menu tutorialManeu = new Menu("Tutorial"); tutorialManeu.getItems().addAll( new CheckMenuItem("Java"), new CheckMenuItem("JavaFX"), new CheckMenuItem("Swing")); sqlMenu.getItems().add(tutorialManeu); menuBar.getMenus().addAll(fileMenu, webMenu, sqlMenu); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
上面的代码生成以下结果。
要将选中的选项或单选按钮添加到菜单,可以使用MenuItem
类作为菜单的子类。以下列表显示了可用作菜单选项的MenuItem
子类。
CheckMenuItem
菜单项类似于复选框控件,允许用户选择项。RadioMenuItem
菜单项类似于RadioButton
控件,允许用户从项目组中仅选择一个项目。
要创建自定义菜单项,可以使用CustomMenuItem
类。SeparatorMenuItem
是CustomMenuItem
类型的派生类,并显示用于分隔菜单项的视线。使用CustomMenuItem
将Slider
添加到MenuItem
上。可参考以下代码实现 -
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.CustomMenuItem; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.SeparatorMenuItem; import javafx.scene.control.Slider; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Menus"); Group root = new Group(); Scene scene = new Scene(root, 300, 250, Color.WHITE); MenuBar menuBar = new MenuBar(); Menu menu = new Menu("File"); menu.getItems().add(new MenuItem("New")); menu.getItems().add(new MenuItem("Save")); menu.getItems().add(new SeparatorMenuItem()); menu.getItems().add(new MenuItem("Exit")); CustomMenuItem customMenuItem = new CustomMenuItem(new Slider()); customMenuItem.setHideOnClick(false); menu.getItems().add(customMenuItem); menuBar.getMenus().add(menu); menuBar.prefWidthProperty().bind(primaryStage.widthProperty()); root.getChildren().add(menuBar); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代码生成以下结果。
要向菜单项添加事件处理程序,可以使用setOnAction()
方法,它接收一个类型为EventHandler <ActionEvent>
的功能接口,它是在选择菜单项时调用的处理程序代码。
import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) { BorderPane root = new BorderPane(); Scene scene = new Scene(root, 300, 250, Color.WHITE); MenuBar menuBar = new MenuBar(); menuBar.prefWidthProperty().bind(primaryStage.widthProperty()); root.setTop(menuBar); Menu fileMenu = new Menu("File"); MenuItem exitMenuItem = new MenuItem("Exit"); fileMenu.getItems().add(exitMenuItem); exitMenuItem.setOnAction(actionEvent -> Platform.exit()); menuBar.getMenus().addAll(fileMenu); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
上面的代码生成以下结果。
标准菜单通常具有键盘助记符(类似于快捷键),以在不使用鼠标的情况下选择菜单项。
用户可以按Alt
键和带下划线_
的字母来激活菜单,然后使用箭头键导航。要向菜单添加键助记符,使用String
值调用构造函数,并在菜单或菜单项的文本中在所选字母前面放置一个下划线字符。
然后将true
传递给setMnemonicParsing(true)
方法。
以下代码创建一个使用字母“F
”作为助记符的文件菜单。
Menu fileMenu = new Menu("_File"); fileMenu.setMnemonicParsing(true);
完整的源代码实现,如下所示 -
import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) { BorderPane root = new BorderPane(); Scene scene = new Scene(root, 300, 250, Color.WHITE); MenuBar menuBar = new MenuBar(); menuBar.prefWidthProperty().bind(primaryStage.widthProperty()); root.setTop(menuBar); Menu fileMenu = new Menu("_File"); fileMenu.setMnemonicParsing(true); MenuItem exitMenuItem = new MenuItem("Exit"); fileMenu.getItems().add(exitMenuItem); exitMenuItem.setOnAction(actionEvent -> Platform.exit()); menuBar.getMenus().addAll(fileMenu); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
上面的代码生成以下结果(同时按住Ctrl + ALT + F
)。
键组合是用于选择菜单选项的键击的组合。键组合称为键盘快捷键。
例如,在Windows平台上,Ctrl + S
的组合键可以保存文件。 在Mac OS平台上,组合键为Command + S
.
Ctrl
,Command
,Alt
,Shift
和Meta
等键称为修饰键。
通常,修饰符与单个字母组合使用。要创建一个组合键,使用KeyCodeCombination
对象,并传入击键和修饰符。
以下代码创建(Ctrl
或Meta
)+ S
的键代码组合。
MenuItem saveItem = new MenuItem("_Save"); saveItem.setMnemonicParsing(true); saveItem.setAccelerator(new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN));
代码使用KeyCombination.SHORTCUT_DOWN
值作为键修饰符,而不是CONTROL_DOWN
或META_DOWN
。SHORTCUT_DOWN
值将使应用程序能够跨平台使用。
CONTROL_DOWN
和META_DOWN
值分别依赖于Windows和MacOS平台,但是SHORTCUT_DOWN
在所有平台上都有效。
上下文菜单是当用户右键单击鼠标按钮时显示的弹出菜单。
要创建上下文菜单,请使用ContextMenu
类。ContextMenu
菜单有一个getItems().add()
方法来添加菜单项。
以下代码显示了使用菜单项(exitItem
)实例化的上下文菜单:
ContextMenu contextFileMenu = new ContextMenu(exitItem);
要响应鼠标右键单击,请添加一个事件处理程序,以监听右键单击事件并调用上下文菜单的show()
方法。
以下代码设置了一个事件处理程序,以分别基于右键或左键单击来显示和隐藏上下文菜单。
hide()
方法由主鼠标单击(左键单击)调用以删除上下文菜单。
primaryStage.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent me) -> { if (me.getButton() == MouseButton.SECONDARY || me.isControlDown()) { contextFileMenu.show(root, me.getScreenX(), me.getScreenY()); } else { contextFileMenu.hide(); } });