前面介绍了创建GUI界面的方式:将AWT组件按某种布局摆放在容器内即可。创建AWT菜单的 方式与此完全类似:将菜单条、菜单、菜单项组合在一起即可。
AWT中的菜单由如下几个类组合而成。
MenuBar:菜单条,菜单的容器。
Menu:菜单组件,菜单项的容器。它也是Menultem的子类,所以可作为菜单项使用。
PopupMenu:上下文菜单组件(右键菜单组件)。
Menultem:菜单项组件,真正被点击的选项。
CheckboxMenuItem: 复选框菜单项组件。
MenuShortcut:菜单快捷键组件。
下面是它们的继承,组合关系:
这里面的Menu实现了菜单容器接口:public class Menu extends MenuItem implements MenuContainer, Accessible
,所以可以用来装Menultem,如图上Menultem组合成Menu。而MenuBar也实现了菜单容器接口,可以装Menu,而Menu组合成MenuBar。
上面的途中,红色框是MenuBar,File,即绿色框是一个Menu,而IDE Setting Sync,即紫色框,也是一个Menu,最终的Disable Sync才是MenuItem。
Menu、Menultem的构造器都可接收一个字符串参数,该字符串作为其对应菜单、菜单项上的标签文本。除此之外,Menultem还可以接收一个MenuShortcut对象,该对象用于指定该菜单的快捷键。MenuShortcut类使用虚拟键代码(而不是字符)来创建快捷键。例如,Ctrl+A (通常都以Ctrl键作为快捷键的辅助键) 快捷方式通过以下代码创建。
1 MenuShortcut ms = new MenuShortcut (KeyEvent.VK_A,[true ]);
true表示要使用shift键。
若想要分割菜单,有两种方式:
调用Menu对象的addSeparator()方法来添加菜单分隔线。
使用添加new Menultem(“-“)的方式来添加菜单分隔线。
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 71 72 73 74 import java.awt.*;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class SimpleMenu { private Frame f = new Frame ("测试" ); private MenuBar mb = new MenuBar (); Menu file = new Menu ("file" ); Menu edit = new Menu ("edit" ); MenuItem newItem = new MenuItem ("new" ); MenuItem saveItem = new MenuItem ("save" ); MenuItem exitItem = new MenuItem ("exit" , new MenuShortcut (KeyEvent.VK_X)); CheckboxMenuItem autoWrap = new CheckboxMenuItem ("auto wrap" ); MenuItem copyItem = new MenuItem ("copy" ); MenuItem pasteItem = new MenuItem ("paste" ); Menu format = new Menu ("format" ); MenuItem commentItem = new MenuItem ("comment" , new MenuShortcut (KeyEvent.VK_SLASH, true )); MenuItem cancelItem = new MenuItem ("cancel comment" ); private TextArea ta = new TextArea (6 , 40 ); public void init () { ActionListener menuListener = e -> { String cmd = e.getActionCommand(); ta.append("单击 " + cmd + " 菜单" + "\n" ); if (cmd.equals("exit" )) { 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 () { @Override 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(); } }
创建一个右键菜单也很容易,创建多个MenuItem,然后加入PopupMenu中,再将PopupMenu加入相关组件即可.