11.6 AWT菜单
前面介绍了创建GUI
界面的方式:将AWT
组件按某种布局摆放在容器内即可。创建AWT
菜单的方式与此完全类似:将菜单条、菜单、菜单项组合在一起即可。
11.6.1 菜单条、菜单和菜单项
AWT
中的菜单由如下几个类组合而成。
类 |
描述 |
MenuBar |
菜单条,菜单的容器。 |
Menu |
菜单组件,菜单项的容器。它也是MenuItem 的子类,所以可作为菜单项使用。 |
PopupMenu |
上下文菜单组件(右键菜单组件)。 |
MenuItem |
菜单项组件。 |
CheckboxMenuItem |
复选框菜单项组件。 |
MenuShortcut |
菜单快捷键组件 |
图11.24显示了AWT
菜单组件类之间的继承、组合关系。
从图中可以看出,MenuBar
和Menu
都实现了菜单容器接口,所以MenuBar可用于盛装Menu,而Menu可用于盛装MenuItem(包括Menu和CheckboxMenuItem两个子类对象)。
Menu
还有一个子类PopupMenu
,代表上下文菜单,上下文菜单无须使用Menubar
盛装。
Menu
、MenuItem
的构造器都可接收一个字符串参数,该字符串作为其对应菜单、菜单项上的标签文本。
除此之外,MenuItem
还可以接收一个MenuShortcut
对象,该对象用于指定该菜单的快捷键。
快捷键
MenuShortcut
类使用虚拟键代码(而不是字符)来创建快捷键。
Ctrl快捷键
例如,Ctrl+A
(通常都以Ctrl
键作为快捷键的辅助键)快捷方式通过以下代码创建:
1
| MenuShortcut ms== new MenuShortcut(KeyEvent.VK_A);
|
Ctrl+Shift快捷键
如果该快捷键还需要Shift
键的辅助,则可使用如下代码:
1
| MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, true);
|
有时候程序还希望对某个菜单进行分组,将功能相似的菜单分成一组,此时需要使用菜单分隔符,AWT
中添加菜单分隔符有如下两种方法。
- 调用
Menu
对象的addSeparator()
方法来添加菜单分隔线
- 使用添加
new Menuitem("-")
的方式来添加菜单分隔线
创建了Menuitem
、Menu
和MenuBar
对象之后,
- 调用
Menu
的add()
方法将多个Menuitem
组合成菜单(也可将另一个Menu
对象组合进来,从而形成二级菜单),
- 再调用
MenuBar
的add()
方法将多个Menu
组合成菜单条,
- 最后调用
Frame
对象的setMenuBar
方法为该窗口添加菜单条。
程序示例 为窗体添加菜单条
下面程序示范了为窗口添加菜单的完整程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| import java.awt.*; import java.awt.event.*;
public class SimpleMenu { private Frame f = new Frame("测试"); private MenuBar mb = new MenuBar(); Menu file = new Menu("文件"); Menu edit = new Menu("编辑"); MenuItem newItem = new MenuItem("新建"); MenuItem saveItem = new MenuItem("保存"); MenuItem exitItem = new MenuItem("退出", new MenuShortcut(KeyEvent.VK_X)); CheckboxMenuItem autoWrap = new CheckboxMenuItem("自动换行"); MenuItem copyItem = new MenuItem("复制"); MenuItem pasteItem = new MenuItem("粘贴"); Menu format = new Menu("格式"); MenuItem commentItem = new MenuItem("注释", new MenuShortcut(KeyEvent.VK_SLASH, true)); MenuItem cancelItem = new MenuItem("取消注释"); private TextArea ta = new TextArea(6, 40);
public void init() { ActionListener menuListener = e -> { String cmd = e.getActionCommand(); ta.append("单击“" + cmd + "”菜单" + "\n"); if (cmd.equals("退出")) { System.exit(0); } }; commentItem.addActionListener(menuListener); exitItem.addActionListener(menuListener); file.add(newItem); file.add(saveItem); file.add(exitItem); edit.add(autoWrap); edit.addSeparator(); edit.add(copyItem); edit.add(pasteItem); format.add(commentItem); format.add(cancelItem); edit.add(new MenuItem("-")); edit.add(format); mb.add(file); mb.add(edit); f.setMenuBar(mb); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.add(ta); f.pack(); f.setVisible(true); }
public static void main(String[] args) { new SimpleMenu().init(); } }
|
上面程序中的菜单既有复选框菜单项和菜单分隔符,也有二级菜单,并为两个菜单项添加了快捷键,为commentItem,exitltem
两个菜单项添加了事件监听器。
运行该程序,并按“Ctrl+Shift+/
”快捷键,将看到如图11.25所示的窗口
AWT
的菜单组件不能创建图标菜单,如果希望创建带图标的菜单,则应该使用Swing
的菜单组件:JMenuBar
、JMenu
、MenuItem
和PopupMenu
组件。Swing
的菜单组件和AWT
的菜单组件的用法基本相似,读者可参考本程序学习使用Swing
的菜单组件。
11.6.2 右键菜单
右键菜单使用PopupMenu
对象表示,创建右键菜单的步骤如下:
- 创建
PopupMenu
的实例。
- 创建多个
Menuitem
的多个实例,依次将这些实例加入PopupMenu
中。
- 将
PopupMenu
加入到目标组件中。
- 为需要出现上下文菜单的组件编写鼠标监听器,当用户释放鼠标右键时弹出右键菜单。
程序示例 右键菜单
下面程序创建了一个右键菜单,该右键菜单就是“借用”前面Simplemenu
中edit
菜单下的所有菜单项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| import java.awt.*; import java.awt.event.*;
public class PopupMenuTest { private TextArea ta = new TextArea(4, 30); private Frame f = new Frame("测试"); PopupMenu pop = new PopupMenu(); CheckboxMenuItem autoWrap = new CheckboxMenuItem("自动换行"); MenuItem copyItem = new MenuItem("复制"); MenuItem pasteItem = new MenuItem("粘贴"); Menu format = new Menu("格式"); MenuItem commentItem = new MenuItem("注释", new MenuShortcut(KeyEvent.VK_SLASH, true)); MenuItem cancelItem = new MenuItem("取消注释");
public void init() { ActionListener menuListener = e -> { String cmd = e.getActionCommand(); ta.append("单击“" + cmd + "”菜单" + "\n"); if (cmd.equals("退出")) { System.exit(0); } }; commentItem.addActionListener(menuListener); pop.add(autoWrap); pop.addSeparator(); pop.add(copyItem); pop.add(pasteItem); format.add(commentItem); format.add(cancelItem); pop.add(new MenuItem("-")); pop.add(format); final Panel p = new Panel(); p.setPreferredSize(new Dimension(300, 160)); p.add(pop); p.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { pop.show(p, e.getX(), e.getY()); } } }); f.add(p); f.add(ta, BorderLayout.NORTH); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.pack(); f.setVisible(true); }
public static void main(String[] args) { new PopupMenuTest().init(); } }
|
运行上面程序,会看到如图11.26所示的窗口:
为什么Windows上的AWT的TextArea组件有默认的右键菜单
AWT
并没有为GUI
组件提供实现,它仅仅是调用运行平台的GUI
组件来创建和平台一致的对等体。假设程序在Windows
平台上运行,则程序中的TextArea
实际上是Windows
的多行文本域组件的对等体,具有和它相同的行为,所以该TextArea
默认就具有右键菜单。