[疯狂Java]AWT:菜单栏、菜单、菜单项、菜单事件处理

2023-11-10

1. 菜单栏、菜单、菜单项之间的关系:

    1) 菜单栏(MenuBar)就是窗口中常见的顶层菜单栏,包含文件、编辑、格式等等子菜单的菜单条,即包含菜单的容器;

    2) 菜单(Menu)是必定包含菜单项或者菜单(嵌套包含菜单,也叫子菜单)的容器;

    3) 菜单项(MenuItem)即最小单位,即可以单击产生特效的菜单按钮,存在于菜单中的元素;

!!注意:Menu是MenuItem的子类,因此Menu是一种特殊的菜单项,可以作为Menu自己中的元素,作为二级菜单出现;

!!在AWT中Menu在MenuBar中是正常的(只有文本标签显示出来),而Menu在Menu中则必定是二级子菜单,除了显示文本标签之外,必定显示一个右角标,表示这是一个二级菜单,可以再展开一摞菜单项;


2. 如何制作菜单:

    1) 首先需要一个菜单栏,使用MenuBar的构造器:MenuBar(); // 只有一个默认的无参构造器

!!将菜单栏和窗口绑定在一起使用Frame的setMenuBar方法:public void Frame.setMenuBar(MenuBar mb); // 指定菜单栏参数

    2) 接着需要在菜单栏中添加菜单(一级子菜单):

         i. 创建子菜单,使用Menu的构造器:Menu(String label); // 指定菜单的文本标签

         ii. 将子菜单加入到菜单栏中,使用MenuBar的add方法(就跟普通容器一样添加):Menu MenuBar.add(Menu m); // 返回的是加入的子菜单

    3) 为子菜单添加菜单项:

         i. 首先要创建菜单项,使用MenuItem的构造器:MenuItem(String label); // 菜单项的文本标签

         ii. 有时需要为菜单项指定快捷键,那么就需要使用可以指定快捷键的构造器:MenuItem(String label, MenuShortcut s); // MenuShortcut是菜单项快捷键类

             a. MenuShortcut构造器:MenuShortcut(int key); // 默认Ctrl+key的组合作为快捷键

             b. 加Shift组合:MenuShortcut(int key, boolean useShiftModifier); // 第二个参数如果为true表示使用Ctrl+Shift+key的组合作为快捷键;

!!注意快捷键和加速键的区别:快捷键必须要使用Ctrl(Shift可选),而加速键必须要使用Alt;

!!key是KeyEvent类定义的静态常量,全部用虚拟键表示,比如'X'就是KeyEvent.VK_X,'/'就是KeyEvent.VK_SLASH,具体是什么可以翻阅手册;

          iii. 使用Menu的add方法将菜单项或者下级子菜单加入其中:MenuItem Menu.add(MenuItem mi); // 返回的是加入的菜单项

!!由于Menu是MenuItem的子类,因此还是使用该方法添加下级子菜单;

!!如果加的是子菜单那么会显示出一个右角标!!表示这是一个下级子菜单,可以进一步展开;

          iv. 示例:Menu m = new Menu("File"); m.add(new MenuItem("Copy", new MenuShortcut(KeyEvent.VK_C)); // 创建了一个Ctrl+C的快捷键菜单项“复制”

!!添加下级子菜单和其菜单项的步骤重复3)即可,仅仅就是简单的嵌套;


3. 菜单分隔符以及添加菜单项的更简单的方法:

    1) 有时候需要将子菜单中的各个菜单项按照逻辑分类,此时可以用分隔符将类型相同的菜单项分到一组去;

    2) 有三种方法可以做到:

         i. void Menu.addSeparator();

         ii. void Menu.add(String label); // 该方法可以直接添加菜单项,根据文本标签添加菜单项,其实现

public void add(String label) {
    add(new MenuItem(label));
}
!!可以看到这是对add方法的重载;

!!这种方法直接add("-");就添加了一条分隔符

         iii. void Menu.add(MenuItem mi); // 直接add(new MenuItem("-");就可以添加分隔符

    3) 一般推荐方法ii.,最为简洁;


4. 菜单事件处理:

    1) 至于单击菜单弹出子菜单等工作都由AWT自动完成,无需程序员管理;

    2) 用户需要自己处理的只有菜单项单击事件,该事件属于ActionEvent类型;

    3) 但是ActionListener接口只有actionPerformed一个方法,因此要监控所有菜单项的单击事件就必须在该方法中加以判断;

    4) 判断是那个菜单项的单击事件还是很简单的,只需要调用e.getActionCommand方法就能获取发生事件的菜单项上的标签文本了,示例:

ActionListener menuListener = e -> {
	String cmd = e.getActionCommand();
	ta.append("Click '" + cmd + "' menu item.\n");
	if (cmd.equals("Exit")) {
		System.exit(0);
	}
};
    5) 最后只要将监听器注册给菜单项即可:public synchronized void MenuItem.addActionListener(ActionListener l);


5. 复选菜单项:

    1) CheckboxMenuItem,即最左侧带一个复选勾菜单项,单击一次打钩并关闭菜单,再单击一次取消打钩并关闭菜单;

    2) 构造器:CheckboxMenuItem(String label); // 就只有指定标签文本的版本

    3) 添加这种菜单项的操作和普通的MenuItem一模一样,ChecboxMenuItem是MenuItem的子类;

!!注意:复选菜单项不产生ActionEvent事件,因此不能用ActionListener来监控它;


6. 示例:

public class AwtTest {

	public void init() {
		Frame f = new Frame("Menu Test");
			MenuBar mb = new MenuBar(); f.setMenuBar(mb);
				Menu file = new Menu("File"); mb.add(file);
					MenuItem newItem = new MenuItem("New"); file.add(newItem);
					MenuItem saveItem = new MenuItem("Save"); file.add(saveItem);
					MenuItem exitItem = new MenuItem("Exit", new MenuShortcut(KeyEvent.VK_X)); file.add(exitItem);
				Menu edit = new Menu("Edit"); mb.add(edit);
					CheckboxMenuItem autoWrap = new CheckboxMenuItem("Auto wrap"); edit.add(autoWrap);
					edit.addSeparator();
					MenuItem copyItem = new MenuItem("Copy"); edit.add(copyItem);
					MenuItem pasteItem = new MenuItem("Paste"); edit.add(pasteItem);
					edit.add(new MenuItem("-"));
					Menu format = new Menu("Format"); edit.add(format);
						MenuItem commentItem = new MenuItem("Comment", new MenuShortcut(KeyEvent.VK_SLASH, true));
							format.add(commentItem);
						MenuItem cancelItem = new MenuItem("Cancel comment"); format.add(cancelItem);
			TextArea ta = new TextArea(6, 40); f.add(ta);
			
			ActionListener menuListener = e -> {
				String cmd = e.getActionCommand();
				ta.append("Click '" + cmd + "' menu item.\n");
				if (cmd.equals("Exit")) {
					System.exit(0);
				}
			};
			newItem.addActionListener(menuListener);
			saveItem.addActionListener(menuListener);
			exitItem.addActionListener(menuListener);
			// autoWrap.addActionListener(menuListener); // CheckboxMenuItem不触发ActionEvent!!
			copyItem.addActionListener(menuListener);
			pasteItem.addActionListener(menuListener);
			commentItem.addActionListener(menuListener);
			cancelItem.addActionListener(menuListener);
			f.addWindowListener(new WindowAdapter() {
				@Override
				public void windowClosing(WindowEvent e) {
					// TODO Auto-generated method stub
					// super.windowClosing(e);
					System.exit(0);
				}
			});
			
			f.pack();
			f.setVisible(true);
	}
	
	public static void main(String[] args) {
		new AwtTest().init();
	}

}


!!!注意:AWT的菜单不支持自制菜单,如果要像MFC那样可以自己画菜单项就必须使用Swing组件了,而Swing组件的用法完全基于AWT的,方法都非常类似;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[疯狂Java]AWT:菜单栏、菜单、菜单项、菜单事件处理 的相关文章

  • javascript(js)中 i++ 与 ++i的区别。轻松搞定自增、自减运算符

    自增 自减运算符是单目运算符 可以放在操作元之前 也可以放在操作元之后 操作元必须是一个整型或浮点型变量 放在操作元前面的自增 自减运算符 会先将变量的值加1 减1 然后再使该变量参与表达式的运算 放在操作元后面的自增 自减运算符 会先使变

随机推荐

  • 将windows10操作系统硬盘格式化为FAT32

    如何将电脑硬盘格式化为FAT32 首先说一下我是在哪里用到这种情况 在使用easyUEFI 安装双系统的时候 需要将卷的格式格式化为FAT32才可以使用 然而有的只可格式化为NTFS 所以我们需要使用到命令来解决 命令为 format FS
  • 软件版本号命名

    这里收集一篇软件版本命名规范 百度找的 在此就借用了 1 1 版本命名规范 软件版本号有四部分组成 第一部分为主版本号 第二部分为次版本号 第三部分为修订版 本号 第四部分为日期版本号加希腊字母版本号 希腊字母版本号共有五种 分别为base
  • Sublime text 3 如何格式化html/CSS/JS代码

    使用Sublime text 3 编写代码是一种享受 使用Sublime text 3 格式化代码插件也是一种享受 具体安装步骤如下 HTML CSS JS Prettify是一款集成了格式化 美化 html css js三种文件类型的插件
  • JUC之实现Callable接口

    public class callable public static void main String args throws ExecutionException InterruptedException FutureTask ft n
  • C# 学习教程九

    C 集合类 集合 collection 提供了一种结构化组织任意对象的方式 而且我们早就知道集合在日常编程工作中的重要性 NET类库提供了丰富的集合数据类型 其种类之繁多甚至使许多人看得眼都花了 这些集合对象都具有各自的专用场合 不管怎么说
  • C语言中float值的比较

    预测以下C程序的输出 include
  • NSGAIII求极值点、超平面方程和截点的方法(用于标准化)

    NSGAIII求极值点 超平面方程和截点的方法 用于标准化 1 标准化的目的 由于测试问题不同目标的量纲或者范围不同 若直接进行运算 则量纲大的值会覆盖掉小的值 因此需要进行标准化 2 极值点 extreme point 在一些文章中 提到
  • 结构体内重载小于号< 及构造函数

    struct Node int d e bool operator lt const Node x const return x d lt d Node int d int e d d e e
  • Zookeeper集群节点数量为什么要是奇数个?

    无论是公司的生产环境 还是自己搭建的测试环境 Zookeeper集群的节点个数都是奇数个 至于为什么要是奇数个 以前只是模糊的知道是为了满足选举需要 并不知道详细的原因 最近重点学习zookeeper 了解到其中的原理 现将其整理记录下来
  • Kafka为何要设计缓冲池机制?初看一脸懵逼,看懂直接跪下!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 Kafka的客户端缓冲机制 2 内存缓冲造成的频繁GC问题 3 Kafka设计者实现的缓冲池机制 4 总结一下 这篇文章 同样给大家聊一个硬核的技术知识 我
  • 疑难杂症之malloc死锁__lll_lock_wait_private

    查看glibc源码可知 malloc内部是有锁的 那说明malloc是一个线程安全型函数 但是它不是一个可重入函数 重入的意思是 比如当前线程正在做malloc 如果此时因为某种原因触发了信号 那么操作系统会保存好现场 正在执行的mallo
  • 网维无盘服务器错误代码,因客户机网关地址写错导致无盘客户机开机获取到dhcp后卡在tftp前无法启动...

    问题现象 客户机启动后获取DHCP界面卡住 DHCP信息中缺少网关 如下图 原因说明 无盘服务端设置的网关地址错误 解决方案 修改为正确的网关地址 问题分析 1 按照过去的经验 出现这种问题一般都是arp绑定错误导致 或者tftp69端口占
  • 医学知识-FFR(冠状动脉血流储备分数)

    什么是FFR 冠状动脉血流储备分数 FFR 作为一项创功能学评价指标 对冠心病的治疗策略具有重要指导意义 前期研究证实FFR指导介入治疗策略不仅安全 经济 并能改善患者的预后 冠状动脉造影及血管内超声均被认为是诊断冠心病的 金标准 但它们只
  • 拥抱开放|OpenPie引领PostgreSQL中国代码贡献力

    OpenPie拥抱开放 和PostgreSQL社区互为兄弟社区 PostgreSQL作为世界上最受欢迎的开源数据库之一 起源于加利福尼亚大学伯克利分校 其卓越的性能倍受广大数据库用户的赞誉 OpenPie一直活跃于PostgreSQL社区
  • pytorch LayerNorm参数详解,计算过程

    目录 说明 LayerNorm参数 normalized shape eps elementwise affine LayerNorm前向传播 以normalized shape为一个int举例 总结 说明 LayerNorm中不会像Bat
  • npm的.npmrc文件在哪里?缓存及全局包文件在什么位置?

    npm的 npmrc文件在哪里 缓存及全局包文件在什么位置 npm作为node开发过程中的必备工具 长期使用之后 您可能会想 这些全局安装的node包都放在硬盘里面的哪个地方 配置文件 npmrc文件在哪里 node包的缓存位置在哪里 本文
  • Ubuntu和windows系统下安装odoo15 企业版终于安装成功了附带安装方法

    方法和社区版一样 用官方方法 轻松简单 界面清爽多了 比社区版 和14的企业版 比起来 效率高了很多 很多细节上的改变 网站模板多了 还有多了视频会议功能 安装方法 先安装数据库 sudo apt install postgresql y
  • Windows------openvino 2022.1安装步骤

    openvino安装 1 下载安装包 官网链接 https www intel com content www us en developer tools openvino toolkit download html 点击download
  • C#泛型方法的定义及使用

    在 C 语言中泛型方法是指通过泛型来约束方法中的参数类型 也可以理解为对数据类型设置了参数 如果没有泛型 每次方法中的参数类型都是固定的 不能随意更改 在使用泛型后 方法中的数据类型则有指定的泛型来约束 即可以根据提供的泛型来传递不同类型的
  • [疯狂Java]AWT:菜单栏、菜单、菜单项、菜单事件处理

    1 菜单栏 菜单 菜单项之间的关系 1 菜单栏 MenuBar 就是窗口中常见的顶层菜单栏 包含文件 编辑 格式等等子菜单的菜单条 即包含菜单的容器 2 菜单 Menu 是必定包含菜单项或者菜单 嵌套包含菜单 也叫子菜单 的容器 3 菜单项