Java 创建图形用户界面(GUI)组件详解之下拉式菜单(JMenu、JMenuItem)、弹出式菜单(JPopupMenu)等

文章目录

  • 组件详解
    • 菜单组件
      • JMenu、JMenuItem 等常用方法
      • 下拉式菜单:JMenu、JMenuItem
      • 弹出式菜单:JPopupMenu
      • 复选框和单选按钮菜单项
      • 键盘助记符和加速器
      • 启用和禁用菜单项

组件详解

菜单组件

JMenu、JMenuItem 等常用方法

  • javax.swing.JMenu

    // 用给定标签构造一个菜单
    JMenu(String label)// 添加一个菜单项(或一个菜单)
    JMenuItem add(JMenuItem item)
    // 将一个有给定标签的菜单项添加到菜单中,并返回这个菜单项
    JMenuItem add(String label)
    // 将一个有给定动作的菜单项添加到菜单中,并返回这个菜单项
    JMenuItem add(Action a)// 将一个分隔行添加到菜单中
    void addSeparator()
    // 将一个分隔符添加到菜单中
    void insertSeparator(int index)// 将一个新菜单项(或子菜单)添加到菜单的指定索引位置
    JMenuItem insert(JMenuItem menu, int index)
    // 将有指定动作的新菜单项增加到菜单的指定索引位置
    JMunuItem insert(Action a, int index)// 从菜单中删除指定的菜单项
    void remove(int index)
    void remove(JMenuItem item)
    
  • javax.swing.JMenuItem extends AbstractButton:

    // 用给定标签构造一个菜单项
    JmenuItem(String label)
    // 为给定动作构造一个菜单项
    JMenuItem(Action a)
    // 用给定的标签和图标构造一个菜单项
    JMenuItem(String label, Icon icon)
    

    javax.swing.AbstractButton

    // 设置动作
    void setAction(Action a)
    // 指定一个图标
    void setIcon(Icon icon)
    // 设置文本相对于图标的水平位置。pos参数是SwingConstants.RIGHT(文本在图标的右侧)或SwingConstants.LEFT
    void setHorizontalTextPosition(int pos)
    
  • javax.swing.JFrame

    // 为这个窗体设置菜单栏
    void setJMenuBar(JMenuBar memubar)
    

下拉式菜单:JMenu、JMenuItem

  • 位于窗口顶部的莱单栏(menu bar)包括了下拉菜单的名字。点击一个名字就可以打开包含菜单项(menu item)和子菜单(submenu)的菜单。当用户点击菜单项时,所有的菜单都会被关闭并且将一条消息发送给程序。

  • 菜单栏是一个可以添加到任何位置的组件,常放置在窗体的顶部

    可以调用 Frame 类的 setJMenuBar() 方法将菜单栏添加到窗体的顶部

  • 代码示例

    // 创建菜单栏
    JMenuBar menuBar = new JMenuBar();
    // 创建一个菜单对象
    JMenu editMenu = new JMenu("Edit");
    // 将菜单添加到菜单栏中
    menuBar.add(editMenu);
    // 向菜单对象中添加菜单项
    JMenuItem pasteItem = new JMenuItem("Paste");
    editMenu.add(pasteItem);	// 快捷形式:JMenuItem pasteItem = editMenu.add("Paste");
    // 向菜单对象中添加分隔符和子菜单
    editMenu.addSeparator();
    // 向菜单对象中添加子菜单
    JMenu optionsMenu = new JMenu("submenu");
    editMenu.add(optionsMenu);
    // 当用户选择菜单时,将触发一个动作事件。需要为每个菜单项安装一个动作监听器
    pasteItem.addActionListener(e -> {});
    

弹出式菜单:JPopupMenu

  • 弹出式菜单(pop-up menu):也称快捷菜单,是不固定在菜单栏中,可以附加在任何组件上使用

    当在附有快捷菜单的组件上右击时,即显示出快捷菜单。例如,鼠标右键菜单

  • javax.swing.JPopupMenu extends JComponent:

    // 在组件c上显示弹出菜单,组件c的左上角坐标为(x,y)(c的坐标空间内)
    void show(Component c, int x, int y)
    // 如果鼠标事件是弹出菜单触发器,则返回true
    boolean isPopupTrigger(MouseEvent event)
    

    java.awt.event.MouseEvent

    // 如果鼠标事件是弹出菜单触发器,则返回true
    boolean isPopupTrigger()
    

    javax.swing.JComponent

    // 获取或设置用于这个组件的弹出菜单
    JPopupMenu getComponentPopupMenu()
    void setComponentPopupMenu(JPopupMenu popup)
    // 获取或设置inheritsPopupMenu属性。如果这个特性已设置或这个组件的弹出菜单为null,就使用其父组件的弹出菜单
    boolean getInheritsPopupMenu()
    void setInheritsPopupMenu(boolean b)
    

复选框和单选按钮菜单项

  • 复选框和单选按钮菜单项会在菜单名旁边显示一个复选框或一个单选按钮。

    当用户选择一个菜单项时,菜单项就会自动地在选择和未选择间进行切换。

  • 除了按钮装饰外,复选框和单选按钮菜单项同其他菜单项的处理一样。

    单选按钮菜单项与普通单选按钮的工作方式一样,必须将它们加入到按钮组中。当按钮组中的一个按钮被选中时,其他按钮都自动地变为未选中。

  • javax.swing.JCheckBoxMenuItem

    // 用给定的标签构造一个复选框菜单项
    JCheckBoxMenuItem(String label)
    // 用给定的标签和给定的初始状态(true为选定)构造一个复选框菜单
    JCheckBoxMenuItem(String label, boolean state)
    

    javax.swing.JRadioButtonMenuItem extends AbstractButton:

    // 用给定的标签构造一个单选按钮菜单项
    JRadioButtonMenuItem(String label)
    // 用给定的标签和给定的初始状态(true为选定)构造一个单选按钮菜单项
    JRadioButtonMenuItem(String label, boolean state)
    

    javax.swing.AbstractButton

    // 获取或设置这个菜单项的选择状态(true为选中)
    boolean isSelected()
    void setSelected(boolean state)
    
  • 代码示例:

    // 创建复选框菜单项
    JCheckBoxMenuItem readonlyItem = new JCheckBoxMenuItem("Read-only");
    optionsMenu.add(readonlyItem);// 创建单选按钮菜单项
    ButtonGroup group = new ButtonGroup();
    JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");
    insertItem.setSelected(true);
    JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype");
    group.add(insertItem);
    group.add(overtypeItem);
    optionsMenu.add(insertItem)
    optionsMenu.add(overtypeItem);
    

键盘助记符和加速器

  • 对于有经验的用户来说,通过键盘助记符选择菜单项确实非常便捷。

    可以通过在菜单项的构造器中指定一个助记字母来为菜单项设置键盘助记符

  • 键盘助记符会在菜单中自动显示,助记字母下面有一条下划线

    例如,菜单项中的标签显示为“About”,字母A带有一个下划线。菜单显示时,用户只需要按下“A”键就可以选择这个菜单项(如果助记字母不在菜单字符串中,同样可以按下这个字母选择菜单项,不过助记符不会在菜单中,同样可以按下这个字母选择菜单项,不过助记符不会在菜单中显示。

  • javax.swing.JMenuItem extends AbstractButton:

    // 用给定的标签和助记符构造一个菜单项
    JMenuItem(String label,int mnemonic)
    // 将k键设置为这个菜单项的加速器。加速器键显示在标签旁边
    void setAccelerator(KeyStroke k)
    

    javax.swing.AbstractButton

    // 设置按钮的助记字符。该字符会在标签中加下划线显示
    void setMnemonic(int mnemonic)
    // 设置按钮文本中加下划线字符的索引。如果不希望第一个出现的助记字符带下划线,就可以使用这个方法
    void setDisplayedMnemonicIndex(int index)
    
  • 代码示例

    var aboutItem = new JMenuItem("About",'A');
    

启用和禁用菜单项

  • 有些时候,某个特定的菜单项可能只在某种特定的环境下才能选择

    例如,当文档以只读方式打开时,Save菜单项就没有意义。当然,可以使用 JMenu.remove() 方法将这个菜单项从菜单中删掉,但用户会对内容不断变化的菜单感到奇怪。实际上,最好禁用这个菜单项,以免触发暂时不适用的命令。被禁用的菜单项显示为灰色,不允许选择

  • javax.swing.JMenuItem

    // 启用或禁用菜单项
    void setEnabled(boolean b)
    

    javax.swing.event.MenuListener

    // 在菜单被选择但尚未打开时调用
    void menuSelected(MenuEvent e)
    // 在菜单被取消选择并且已经关闭之后调用
    void menuDeselected(MenuEvent e)
    // 当菜单被取消时调用。例如,用户点击菜单以外的区域
    void menuCanceled(MenuEvent e)
    
  • 启用和禁用菜单项有两种策略:

    • 策略1:每次环境发生变化时,就对相关的菜单项或动作调用 setEnabled() 方法

      例如:一旦文档以只读方式打开,可以找到并禁用 “Save” 和 “Save As” 菜单项。

    • 策略2:在显示菜单之前禁用这些菜单项

      为此,必须为“菜单选中”事件注册一个监听器。

      menuSelected() 方法在菜单显示之前调用,所以可以用这个方法禁用或启用菜单项。

      下面的代码显示了选中只读复选框菜单项时如何禁用Save和Save As动作。

      public void menuSelected(MenuEvent event) {saveAction.setEnabled(!readonlyItem.isSelected());saveAsAction.setEnabled(!readonlyItem.isSelected());
      }
      

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

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

相关文章

整理—Redis

目录 Redis底层的数据结构 ZSet用过吗 Zset 底层是怎么实现的 跳表是怎么实现的? Redis为什么使用跳表而不是用B树? 压缩列表是怎么实现的? Redis 中的 listpack 哈希表是怎么扩容的? String 是使用什么存储的 Redis为什么快&#xf…

c语言基础程序——经典100道实例。

c语言基础程序——经典100道实例 001, 组无重复数字的数002,企业发放的奖金根据利润提成003,完全平方数004,判断当天是这一年的第几天005,三个数由小到大输出006,输出字母C图案007,特殊图案008&…

Nginx(Linux):服务器版本升级和新增模块

目录 1、概述2、使用Nginx服务信号完成Nginx升级2.1 备份当前版本的Nginx2.2 向服务器导入新的Nginx2.3 向服务器导入新的Nginx2.4 停止老版本Nginx 3、使用Nginx安装目录的make命令完成升级3.1 备份当前版本的Nginx3.2 向服务器导入新的Nginx3.3 执行更新命令 1、概述 如果想…

cisp考试费用多少?

在网络安全领域,CISP(注册信息安全专业人员)认证备受关注。对于许多想要在这个领域深入发展的人来说,了解 CISP 考试费用是他们迈出的第一步。那么,CISP 考试费用究竟是多少呢? 一、CISP 认证的重要性与价值 (一)行业认可度高 CISP 是由中国…

计算机网络:数据链路层 —— 扩展共享式以太网

文章目录 共享式以太网共享式以太网存在的问题在物理层扩展以太网扩展站点与集线器之间的距离扩展共享式以太网的覆盖范围和站点数量 在链路层扩展以太网网桥的主要结构网桥的基本工作原理透明网桥自学习和转发帧生成树协议STP 共享式以太网 共享式以太网是当今局域网中广泛采…

道路垃圾识别数据集 含pt模型界面 18类 共7542张图片,xml和txt标签都有;

道路垃圾识别数据集 含pt模型&界面 18类 共7542张图片,xml和txt标签都有; YOLO道路垃圾识别系统 系统概述 名称:YOLO道路垃圾识别系统 图片数量:7542张标注格式:XML和TXT(支持YOLO格式)类…

智诊小助手TF卡记录文件导出

若想将TF卡中记录的数据文件导出可按以下的流程进行配置: 点击主界面中的导出选项即可进入到 下图中TF卡应用界面 点击TF卡应用界面中“查看记录文件”的选项,进入导出文件界面。 点击“选择”进入勾选文件的界面 点击“导出”后,点…

Android Studio 的 Gradle 任务列表只显示测试任务

问题现象如下: 问题原因: 这是因为Android Studio 设置中勾选了屏蔽其他gradle任务的选项。 解决方法: File -> Settings -> Experimental 取消勾选Only include test tasks in the Gradle task list generated during Gradle Sync&…

【Golang】Gin框架:Go语言中的轻量级Web框架

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理 学习内容: AWS的虚拟私有,共有子网以及ACL定义公网碉堡主机子网,私有子网和共有子网以及varnish反向代理 1. AWS的虚拟…

springboot051医院管理系统(论文+源码)_kaic

医院管理系统 摘要 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求,创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系统的系统分析部分&#…

Gitlab 完全卸载–亲测可行

1、停止gitlab gitlab-ctl stop2.卸载gitlab(注意这里写的是gitlab-ce) rpm -e gitlab-ce 3、查看gitlab进程 ps aux | grep gitlab 4、杀掉第一个进程(就是带有好多.............的进程) 5、删除所有包含gitlab文件 find / …

配置文件get调用为null

生成get方法调用显示为null 修改get方法去掉static调用成功

LCWLAN设备的实际使用案例

我们的LCWLAN设备在实际使用中以裸板的形式放在客户的智能总线控制器中,客户的 智能总线刀片灯,柔性灯货架,柔性感应钢网柜以及智能电子料架等设备都是接到总线控制 器中,然后总控制器通过CAN总线和我们的LCWLAN设备连接&#xff…

两个表格讲清日语形容词怎么用!柯桥小语种学习零基础日语培训

い形容词 1、敬体形和简体形 _ 肯定形 否定形 敬体现在时 词干+い+です 词干+くない+です 敬体过去时 词干+い+でした 词干+くない+です/ありません 简体现在时…

基于Qt的雷达航迹控件(解决QWidget绘制多点卡顿问题)

:详细讲解 在本篇文章中,我们将详细探讨如何使用Qt创建一个雷达轨迹系统。该系统可以模拟雷达轨迹的显示、处理用户的交互并管理轨迹选中状态。通过这篇文章,您将了解到自定义类 RadarTrackItem、RadarTrackManager、OverlayWidget 和 Radar…

大数据-180 Elasticsearch - 原理剖析 索引写入与近实时搜索

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

美摄科技云服务解决方案,方案成熟,接入简单

美摄科技作为视频处理领域的先锋,凭借其强大的技术实力和深厚的行业经验,推出了成熟的云服务解决方案,为轻量化视频制作开辟了全新的道路。 一、成熟方案,接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…

Vulnhub打靶-matrix-breakout-2-morpheus

基本信息 靶机下载:https://pan.baidu.com/s/1kz6ei5hNomFK44p1QT0xzQ?pwdy5qh 提取码: y5qh 攻击机器:192.168.20.128(Windows操作系统) 靶机:192.168.20.0/24 目标:获取2个flagroot权限 具体流程 …

前端 js 处理一个数组 展示成层级下拉样式

好记性不如赖笔头; 前端开发中,不管是什么时候都会遇到select 下拉框的使用,一般情况下,数据处理后端都会处理好。前端一般使用相应技术栈所推荐的公共组件就可以了。 但是一般也有后端不处理的数组,需要前端自己处理成…