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);
    }
}

此处为语雀视频卡片,点击链接查看:Video_2022-04-28_161022.wmv

指定菜单项

要将选中的选项或单选按钮添加到菜单,可以使用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);
    }
}

键组合

键组合是用于选择菜单选项的键击的组合。键组合称为键盘快捷键。

例如,在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在所有平台上都有效。

要响应鼠标右键单击,请添加一个事件处理程序,以监听右键单击事件并调用上下文菜单的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();
    }
});

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的JavaFX二级菜单示例: ```java 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.BorderPane; import javafx.stage.Stage; public class TwoLevelMenuExample extends Application { @Override public void start(Stage primaryStage) throws Exception { BorderPane root = new BorderPane(); MenuBar menuBar = new MenuBar(); Menu fileMenu = new Menu("File"); MenuItem openFile = new MenuItem("Open File"); MenuItem saveFile = new MenuItem("Save File"); fileMenu.getItems().addAll(openFile, saveFile); Menu editMenu = new Menu("Edit"); MenuItem cut = new MenuItem("Cut"); MenuItem copy = new MenuItem("Copy"); MenuItem paste = new MenuItem("Paste"); editMenu.getItems().addAll(cut, copy, paste); MenuBar subMenu = new MenuBar(); Menu optionsMenu = new Menu("Options"); MenuItem settings = new MenuItem("Settings"); optionsMenu.getItems().add(settings); subMenu.getMenus().add(optionsMenu); menuBar.getMenus().addAll(fileMenu, editMenu, subMenu); root.setTop(menuBar); Scene scene = new Scene(root, 400, 300); primaryStage.setTitle("Two Level Menu Example"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 该示例创建了一个包含文件和编辑两个主菜单以及一个选项子菜单菜单栏。选项子菜单包含一个设置菜单项。当用户单击菜单项时,可以显示相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值