JavaFX 菜單

2020-10-22 14:02 更新

JavaFX教程 - JavaFX 菜單


菜單是桌面應(yīng)用程序選擇選項(xiàng)的標(biāo)準(zhǔn)方法。

菜單和菜單項(xiàng)可以具有用于選擇選項(xiàng)的鍵組合,稱為鍵盤快捷鍵。

創(chuà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é)果。

null

特殊菜單項(xiàng)

要將選中的選項(xiàng)或單選按鈕添加到菜單,我們可以使用以下選項(xiàng) MenuItem 類的子類。

以下列表顯示了可用作菜單選項(xiàng)的可用 MenuItem 子類。

  • javafx.scene.control.CheckMenuItem
  • javafx.scene.control.RadioMenuItem
  • javafx.scene.control.CustomMenuItem
  • javafx.scene.control.SeparatorMenuItem
  • javafx.scene.control.Menu

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é)果。

null


要向菜單項(xiàng)添加事件處理程序,我們可以使用 ?setOnAction() ?方法,它接收一個(gè)類型為 ??EventHandler <ActionEvent?>? 的功能接口,它是在選擇菜單項(xiàng)時(shí)調(diào)用的處理程序代碼。

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é)果。

null

關(guān)鍵助記符

標(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é)果。

null

鍵組合

鍵組合是用于選擇菜單選項(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();
    }
});


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)