前面介绍了创建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;

/**
* @author YL
* @date 2018/7/26 20:16
*/
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窗口设置菜单条
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加入相关组件即可.