菜單是桌面應(yīng)用程序選擇選項(xiàng)的標(biāo)準(zhǔn)方法。
菜單和菜單項(xiàng)可以具有用于選擇選項(xiàng)的鍵組合,稱為鍵盤快捷鍵。
我們必須創(chuàng)建一個(gè)菜單欄 javafx.scene.control.MenuBar
對(duì)象來(lái)保存 javafx.scene.control.Menu
對(duì)象。
菜單對(duì)象可以包含 Menu 和 javafx.scene.control.MenuItem 對(duì)象。菜單可以包含其他菜單作為子菜單。MenuItems 是 Menu 對(duì)象內(nèi)的子選項(xiàng)。
以下代碼顯示如何創(chuàng)建菜單欄并添加菜單和菜單項(xiàng)。
菜單類是 MenuItem 的子類,它有一個(gè) ?getItems()
?。?add()
?方法,它能夠添加例如其他 Menu 和 MenuItem 實(shí)例。
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); } }
上面的代碼生成以下結(jié)果。
要將選中的選項(xiàng)或單選按鈕添加到菜單,我們可以使用以下選項(xiàng) MenuItem 類的子類。
以下列表顯示了可用作菜單選項(xiàng)的可用 MenuItem 子類。
CheckMenuItem 菜單項(xiàng)類似于復(fù)選框控件,允許用戶選擇項(xiàng)目。
RadioMenuItem 菜單項(xiàng)類似于 RadioButton 控件,允許用戶從項(xiàng)目組中僅選擇一個(gè)項(xiàng)目。
要?jiǎng)?chuàng)建自定義菜單項(xiàng),我們可以使用 CustomMenuItem 類。
SeparatorMenuItem 是 CustomMenuItem 類型的派生類顯示用于分隔菜單項(xiàng)的視線。
使用 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(); } }
上面的代碼生成以下結(jié)果。
要向菜單項(xiàng)添加事件處理程序,我們可以使用 ?setOnAction()
?方法,它接收一個(gè)類型為 ??
? 的功能接口,它是在選擇菜單項(xiàng)時(shí)調(diào)用的處理程序代碼。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); } }
上面的代碼生成以下結(jié)果。
標(biāo)準(zhǔn)菜單通常具有鍵盤助記符,以在不使用鼠標(biāo)的情況下選擇菜單項(xiàng)。
用戶可以點(diǎn)擊 Alt
鍵和帶下劃線 _
的字母來(lái)激活菜單,然后使用箭頭鍵導(dǎo)航。
要向菜單添加鍵助記符,我們使用String值和調(diào)用構(gòu)造函數(shù)在菜單或菜單項(xiàng)的文本中,在所選字母前面放置一個(gè)下劃線字符。
然后我們將 ?true
? 傳遞給?setMnemonicParsing(true)
?方法。
以下代碼創(chuàng)建一個(gè)使用字母“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); } }
上面的代碼生成以下結(jié)果。
鍵組合是用于選擇菜單選項(xiàng)的鍵擊的組合。鍵組合稱為鍵盤快捷鍵。
例如,在 Windows平臺(tái)上,Ctrl + S 的組合鍵可以保存文件。在Mac OS平臺(tái)上,組合鍵為 Command + S.
Ctrl,Command,Alt,Shift 和 Meta 等鍵稱為修飾鍵。
通常,修飾符與單個(gè)字母組合使用。
要?jiǎng)?chuàng)建鍵組合,使用 KeyCode 組合對(duì)象并傳遞擊鍵和修飾符。
以下代碼創(chuàng)建 (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 的值將啟用應(yīng)用程序跨平臺(tái)。
值 CONTROL_DOWN和META_DOWN 是系統(tǒng)依賴于 Windows 和 MacOS 平臺(tái),但 SHORTCUT_DOWN 適用于所有平臺(tái)。
上下文菜單是當(dāng)用戶右鍵單擊鼠標(biāo)按鈕時(shí)顯示的彈出菜單。
要?jiǎng)?chuàng)建上下文菜單,使用 ContextMenu
類。ContextMenu 菜單有一個(gè) ?getItems()
?。?add()
?方法來(lái)添加菜單項(xiàng)。
以下代碼顯示了使用菜單項(xiàng) (exitItem) 實(shí)例化的上下文菜單:
ContextMenu contextFileMenu = new ContextMenu(exitItem);
要響應(yīng)鼠標(biāo)右鍵單擊,請(qǐng)?zhí)砑邮录幚沓绦蛞詡陕?tīng)右鍵單擊事件調(diào)用上下文菜單的?show()
?方法。
以下代碼設(shè)置了一個(gè)事件處理程序來(lái)顯示和隱藏上下文菜單基于右或左鼠標(biāo)點(diǎn)擊。
?hide()
?方法是通過(guò)主鼠標(biāo)單擊(左鍵單擊)以刪除上下文菜單。
primaryStage.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent me) -> { if (me.getButton() == MouseButton.SECONDARY || me.isControlDown()) { contextFileMenu.show(root, me.getScreenX(), me.getScreenY()); } else { contextFileMenu.hide(); } });
更多建議: