[疯狂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:菜单栏、菜单、菜单项、菜单事件处理 的相关文章

  • Java 中处理循环事件的优雅方法?

    我认为这对我来说不是一个特定的问题 每个人以前可能都遇到过这个问题 为了正确地说明它 这里有一个简单的 UI 正如您所看到的 这两个旋转器控制着一个变量 A 唯一的区别是他们使用不同的视图来控制它 由于这两个旋钮的显示值是同步的 因此会出现
  • 如何监控Event Dispatch Thread队列?

    我有一个繁重的java项目 它无法响应用户 我发现事件调度线程中需要很长时间的事件会导致我的项目运行缓慢 所以 我有两个问题 如何监视事件调度线程并查看队列中的事件以及最终哪些事件在事件调度线程中花费更多时间 如您所知 invokeLate
  • 调用 mouseClicked() 后 JComponent 消失

    我正在用 Swing 编写一个 Java GUI 程序 界面如下所示 当用户单击右侧的其中一张图片时 我希望在左上角的橙色区域中显示它的小预览 我通过以下方式从计算机上的目录中提取所有图像文件SwingWorker线程 http docs
  • 在 JFrame 上绘制画布

    我正在尝试用 Canvas 绘制简单的形状 在这堂课中我已经设置了绘画 public class Game extends Canvas FIELDS public int WIDTH 1024 public int HEIGHT WIDT
  • 当 Toolkit.getDefaultToolkit() 抛出 AWTError 时,如何在 Java 中读取图像?

    我正在使用 Java 读取图像文件 java awt Image img Toolkit getDefaultToolkit createImage filePath 在某些系统上这不起作用 它会抛出一个 AWTError 抱怨 sun a
  • FontMetrics 设置字体?

    我正在制作一个程序 需要在 FontMetrics 对象内设置 Font 我之前已经创建了 fontmetrics 但现在我无法再访问 Graphics 对象 然而 我想更改 FontMetrics 内的字体 即创建一个新的 FontMet
  • PaintComponent 未绘制到 JPanel 上

    我正在做一项家庭作业 我应该制作一个程序 允许您绘制自定义形状和线条 并将它们在屏幕上移动 最初我使用的是 public voidpaint g 绘制 但当我调用重新绘制时 形状在闪烁 因此我切换到paintComponent g 然而 当
  • 对 JPanel 使用 addMouseListener() 和 PaintComponent()

    这是我的后续previous https stackoverflow com questions 12175174 paintcomponent vs paint and jpanel vs canvas in a paintbrush t
  • 在屏幕上查找复合位置

    我正在 Java 中为 SWT 和 AWT 实现一个屏幕键盘 一件重要的事情是将键盘移动到可以显示所选文本字段的位置 并且不要位于屏幕键盘后面 对于 AWT 我可以检测当前选定组件的位置 Component owner KeyboardFo
  • 为什么 Desktop.Open() 在安装 MagicISO 时不起作用

    这是我的代码 if Desktop isDesktopSupported Desktop desktop Desktop getDesktop if desktop isSupported Desktop Action OPEN try d
  • 有什么解决方法可以让复制/粘贴在 Mac 上的 JDK 7 AWT Applet 中工作吗?

    由于 Apple 在 Mac 上强制更新到 JDK 7 旧的 AWT 小程序不再支持复制 粘贴 例如 如果您访问 简单的 AWT 文本字段示例 http www willamette edu gorr classes cs231 lectu
  • 将 AWT 图像转换为 SVG 图像

    我正在使用以下代码摄取 AWT 图像 从 PDF 通过 PDFBox private java awt Graphics2D graphics public void drawImage java awt Image awtImage ja
  • 在 Swing JFrame 上添加 WebView 控件

    我正在开发与 JavaFX 控件混合的 Swing 应用程序 我创建了一个 JavaFX 控件 WebView 浏览 HTML 文件 但我想要 要知道 如何在 Swing 的容器上添加此 Web 视图控件JFrame 鉴于已经存在jFram
  • 阻止 robots.mouseMove 生成​​ MouseEvent?

    我有一个 3D 游戏 每次移动光标时 我希望它重置到中间 问题是 robots mouseMove 调用 MouseEvent 它确实有意义 并重置位置 所以我无法旋转 谢谢你 我更喜欢如下代码 component removeMouseL
  • 什么是 AWT-Windows 线程?

    当我使用 AWT 时 在调用Toolkit getDefaultToolkit 我已经打印了程序中当前正在运行的线程 我想知道那是什么AWT Windows在后台运行的线程 它有什么作用以及为什么有6优先事项 另外 该行 Thread AW
  • 如何将 BufferedImage 转换/转换为图像?

    我想转换一个BufferedImage to an java awt Image 我的源图像是 tif 所以我使用 JAI 将其读取为PlanarImage PlanarImage 源 JAI create 文件加载 IMG DIR tag
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • Java 和 GUI - 根据 MVC 模式,ActionListener 属于哪里?

    我目前正在编写一个模板 Java 应用程序 不知何故 如果我想完全遵循 MVC 模式 我不确定 ActionListener 属于哪里 该示例基于 Swing 但它不是关于框架 而是关于 Java 中 MVC 的基本概念 使用任何框架创建
  • 全屏独占模式下的 AWT 框架在窗口弹出对话框中最小化

    我正在开发一个在全屏独占模式下使用 awt 框架的应用程序 一切正常 直到弹出窗口可见 这会抢走焦点 我的应用程序将被最小化 这是我的框架的初始化代码 if ApplicationConfig getInstance useFullscre
  • 多个事件分派线程

    我是 Java Swing 新手 我的问题与事件队列和调度线程相关 我读到可以有多个事件队列 每个队列应用上下文 http www java2s com Open Source Java Document 6 0 JDK Modules s

随机推荐

  • 将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 菜单项