JavaFX菜单(Menu)
菜单是桌面应用程序选择选项的标准方法。
菜单和菜单项可以与选择选项快捷键组合,称为键盘快捷键。
创建菜单和菜单项
必须创建一个菜单栏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
子类。
- javafx.scene.control.CheckMenuItem
- javafx.scene.control.RadioMenuItem
- javafx.scene.control.CustomMenuItem
- javafx.scene.control.SeparatorMenuItem
- javafx.scene.control.Menu
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();
}
});