JavaFX菜单(Menu)

news2024/11/21 2:30:19

菜单是桌面应用程序选择选项的标准方法。
菜单和菜单项可以与选择选项快捷键组合,称为键盘快捷键。

创建菜单和菜单项

必须创建一个菜单栏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();
    }
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

思维+构造 CF1950F - 0, 1, 2, Tree!

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1950F - 0, 1, 2, Tree! 二、解题报告 1、思路分析 考虑让构造n个结点的二叉树如何构造高度最小&#xff1f; 构造完全二叉树&#xff0c;即一层一层放 对于本题&#xff0c;显然我们要先放“2”结点&…

十六.吊打面试官系列-JVM优化-JVM性能调优实战

前言 在Java应用的开发和运维过程中&#xff0c;JVM的性能调优是一项至关重要的工作。随着业务的增长和复杂度的提升&#xff0c;线上问题排查、内存监控、参数优化以及压力测试成为每一位开发者和运维人员必须面对的挑战。 本篇文章将带您走进JVM性能调优的世界&#xff0c;…

agentsim流程分析

agentsim 前言 这里是类斯坦福小镇项目agentsim的一个调研。主要目的是寻找行为树模式的氛围npc不够智能的解决方案。下面会先简单介绍下一些关键的类&#xff0c;然后再讲解流程。该项目有段时间没维护了&#xff0c;没法直接运行&#xff0c;有兴趣的可以修修&#xff0c;主…

乘法与位运算

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 题目描述&#xff1a; 进行一个运算单元的电路设计&#xff0c;A[7:0]*11111011&#xff0c;尽量用最少的资源实现&#xff0c;写出对应的 RTL 代码。 信号示意&#xff1a; A信号输入 B 信号…

MySQL 的故事:一场 SQL 语句的戏剧演绎

本文由 ChatMoney团队出品 第一幕&#xff1a;解析与优化 - “翻译官与谋士” SQL 解析器是第一个上场的角色&#xff0c;任务就是把 SQL 请求翻译成 MySQL 能听懂的语言。就像你点餐时&#xff0c;服务员得听懂你到底要什么菜。不然你说“我要一盘炒青菜”&#xff0c;结果服…

gitlab2024最新版安装

系统&#xff1a;redhat9.0 gitlab版本&#xff1a;gitlab-ce-16.10.7-ce.0.el9.x86_64.rpm 安装组件&包依赖&#xff1a;https://packages.gitlab.com/gitlab/gitlab-ce/packages/ol/9/gitlab-ce-16.10.7-ce.0.el9.x86_64.rpm 参考&#xff1a; 前提&#xff1a; 下载gitl…

【车载开发系列】CAN通信总线再理解(上篇)

【车载开发系列】CAN通信总线再理解&#xff08;上篇&#xff09; 【车载开发系列】CAN通信总线再理解上篇 【车载开发系列】CAN通信总线再理解&#xff08;上篇&#xff09;一. CAN的概念1&#xff09;硬件组成2&#xff09;编码与负载3&#xff09;收发数据4&#xff09;半双…

深入理解并打败C语言难关之一————指针(5)(最终篇)

前言&#xff1a; 仔细一想&#xff0c;小编已经把指针的大部分内容都说了一遍了&#xff0c;小编目前有点灵感枯竭了&#xff0c;今天决定就结束指针这一大山&#xff0c;可能很多小编并没有提到过&#xff0c;如果有些没说的小编会在后续博客进行补充道&#xff0c;不多废话了…

电脑桌面图标大小怎么调整?多种方法图文教程【全】

随着数字化生活的深入&#xff0c;电脑桌面图标的大小调整成为了我们日常使用中经常需要面对的问题。无论是为了更清晰地查看文件内容&#xff0c;还是为了美化桌面布局&#xff0c;掌握调整图标大小的方法都显得尤为重要。电脑桌面图标大小怎么调整&#xff1f;本文将为您提供…

LVGL开发教程-按钮Button

系列文章目录 知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 1. 普通Button 2.可选中Button 3.按钮事件处理 总结 前言 在图形用户界面&#xff08;GUI&#xff09;开发中&#xff0c;按钮&#xff08;Button&#xff09;是用户与程序交互的重要组件之一…

面向龙芯LoongArch平台的AMD GPU补丁解决了一个“巨大平台错误“

本周一Linux内核社区发布了一组补丁&#xff0c;旨在让老旧的 AMD Radeon GFX7/GFX8 时代图形处理器在龙芯LoongArch平台上运行。这些在Loongson平台上处理老旧Radeon Hawaii~Polaris GPU的补丁指出了这些中国计算系统的一个"巨大的平台错误"。 AMDGPU 和 Radeon 内核…

揭秘与应对:一打开移动硬盘就提示格式化的深度解析

在日常的数据存储与交换中&#xff0c;移动硬盘因其便携性和大容量而备受青睐。然而&#xff0c;有时我们可能会遇到一种令人困扰的现象&#xff1a;当试图打开移动硬盘时&#xff0c;系统会弹出一个警告窗口&#xff0c;提示“磁盘未被格式化&#xff0c;是否现在格式化&#…

跨境电商打造高效运营:自养号测评系统的五大优势

在当前的跨境电商行业&#xff0c;测评作为提升产品排名和促进销售的关键策略&#xff0c;其重要性日益凸显。为了在竞争激烈的市场中获得优势&#xff0c;卖家需要运用自养号测评系统等工具&#xff0c;以实现更高效的运营和更佳的业绩。 自养号测评系统具备多方面的优势&…

Python酷库之旅-比翼双飞情侣库(15)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

hugging face:大模型时代的github介绍

1. Hugging Face是什么&#xff1a; Hugging Face大模型时代的“github”&#xff0c;很多人有个这样的认知&#xff0c;但是我觉得不完全准确&#xff0c;他们相似的地方在于资源丰富&#xff0c;github有各种各样的软件代码和示例&#xff0c;但是它不是系统的&#xff0c;没…

数据库 |试卷1试卷2

1.数据库语言四大语句 4.四大类&#xff08;DDL、DML、DQL、DCL&#xff09;_中度ddl-CSDN博客 数据定义&#xff08;data defination language&#xff09; 查询、创建、删除、使用 #查询所有数据库 show databases;#查询当前数据库 select database();#创建数据库 create …

利用DeepFlow解决APISIX故障诊断中的方向偏差问题

概要&#xff1a;随着APISIX作为IT应用系统入口的普及&#xff0c;其故障定位能力的不足导致了在业务故障诊断中&#xff0c;APISIX常常成为首要的“嫌疑对象”。这不仅导致了“兴师动众”式的资源投入&#xff0c;还可能使诊断方向“背道而驰”&#xff0c;从而导致业务故障“…

【CT】LeetCode手撕—46. 全排列

目录 题目1- 思路2- 实现⭐46. 全排列——题解思路 3- ACM实现 题目 原题连接&#xff1a;46. 全排列 1- 思路 模式识别 模式1&#xff1a;不含重复数字的数组 nums ——> 任意顺序 可能的全排列 ——> 回溯模式2&#xff1a;全排列 ——> 排列问题&#xff0c;不同…

PLC通过Profibus协议转Modbus协议网关接LED大屏通讯

一、背景 Modbus协议和Profibus协议是两种常用于工业控制系统的通信协议&#xff0c;它们在自动化领域中起着重要的作用。Modbus是一种串行通信协议&#xff0c;被广泛应用于各种设备之间的通信&#xff0c;如传感器、执行器、PLC等。而Profibus则是一种现场总线通信协议&…

可以把 FolkMQ 内嵌到 SpringBoot3 项目里(可内嵌的消息中间件)

之前发了《把 FolkMQ 内嵌到 SpringBoot2 项目里&#xff08;比如 “诺依” 啊&#xff09;》。有人说都淘态了&#xff0c;有什么好内嵌的。。。所以再发个 SpringBoot3 FolkMQ 是一个 “纯血国产” 的消息中间件。支持内嵌、单机、集群、多重集群等多种部署方式。 内嵌版&am…