创建GUI界面的方式:将AWT组件按某种布局摆放在容器内即可。创建AWT菜单的方式与此完全类似:将菜单条、菜单、菜单项组合在一起即可。
菜单条、菜单和菜单项
AWT中的菜单有以下几个类组合而成:
(1)MenuBar:菜单条,菜单的容器
(2)Menu:菜单组件,菜单项的容器。它也是MenuItem的子类,所以可作为菜单项使用
(3)PopupMenu:上下文菜单组件(右键菜单组件)
(4)MenuItem:菜单项组件
(5)CheckboxMenuItem:复选框菜单项组件
(6)MenuShortcut:菜单快捷键组件
AWT菜单组件类之间的继承、组合关系,从下图可以看出MenuBar和Menu都实现了菜单容器接口,所以MenuBar可用于盛装Menu,而Menu可用于盛装MenuItem(包括Menu和CheckMenuItem两个子类对象),Menu还有一个子类:PopupMenu代表上下文菜单,上下文菜单无须使用MenuBar盛装。
Menu、MenuItem的构造器都可接受一个字符串参数,该字符串作为其对应菜单、菜单项上的标签文本。除此之外,MenuItem还可以接受一个MenuShortcut对象,该对象用于指定该菜单的快捷键。MenuShortcut类使用虚拟键代码(而不是字符)来创建快捷键。
例如,Ctrl-A(通常都以Ctrl键作为快捷键的辅助键)快捷方式通过以下的代码创建:
MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A);
如果该快捷键还需要Shift键的辅助,则可使用如下代码:
MenuShortcut ms = new MenuShortcut(keyEvent.VK_A, true);
有时候我们还希望将某个菜单进行分组,将功能相似的菜单分成一组,此时需要使用菜单分隔符,
AWT中添加菜单分隔符有两种方法:
(1)调用Menu对象的addSeparator方法来添加菜单分割线
(2)添加new MenuItem("-")菜单项来添加菜单分隔线
创建了MenuItem、Menu和MenuBar对象之后,然后调用Menu的add方法将多个MenuItem组合成菜单(也可将另一个Menu对象组合进来,从而形成二级菜单),再调用MenuBar的add方法将多个Menu组合成菜单条,最后调用Frame对象的setMenuBar为该窗口添加菜单条。
/**
* 下面程序示范了为窗口添加菜单的完整程序
*/
package codes11;
import java.awt.CheckboxMenuItem;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
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 menuBar = new MenuBar();
Menu file = new Menu("文件");
Menu edit = new Menu("编辑");
MenuItem newItem = new MenuItem("新建");
MenuItem saveItem = new MenuItem("保存");
// 创建exitItem菜单项,指定使用Ctrl+X快捷键
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("格式");
// 创建commentItem菜单项,指定使用Ctrl+Shift+/快捷键
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 = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
ta.append("单击“" + cmd + "” 菜单" + "\n");
if (cmd.equals("退出")) {
System.exit(0);
}
}
};
// 为commentItem菜单项添加事件监听器
commentItem.addActionListener(menuListener);
exitItem.addActionListener(menuListener);
// 为file菜单添加菜单项
file.add(newItem);
file.add(saveItem);
file.add(exitItem);
// 为edit菜单添加菜单项
edit.add(autoWrap);
// 使用addSeparator方法来添加菜单分隔线
edit.addSeparator();
edit.add(copyItem);
edit.add(pasteItem);
// 为format菜单添加菜单项
format.add(commentItem);
format.add(cancelItem);
// 使用添加new MenuItem("-")的方式来添加菜单分隔线
edit.add(new MenuItem("-"));
// 将format菜单组合到edit菜单中,从而形成二级菜单
edit.add(format);
// 将file、edit菜单添加到menuBar菜单栏中
menuBar.add(file);
menuBar.add(edit);
// 为f窗口设置菜单条
f.setMenuBar(menuBar);
// 以匿名内部类的形式创建事件监听器对象
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();
}
}
右键菜单
右键菜单使用PopupMenu对象表示,创建右键菜单的步骤如下:
(1)创建PopupMenu的实例
(2)创建多个MenuItem的多个实例,依次将这些实例加入PopupMenu中
(3)将PopupMenu加入到目标组件之中
(4)为需要出现上下文菜单的组件编写鼠标监听器,当用户释放鼠标右键时弹出右键菜单
/**
* 程序创建了一个右键菜单
*/
package codes11;
import java.awt.BorderLayout;
import java.awt.CheckboxMenuItem;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.Panel;
import java.awt.PopupMenu;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
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 = new ActionListener() {
@Override
public void actionPerformed(ActionEvent 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 MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
// 如果释放的是鼠标右键
if (e.isPopupTrigger()) {
pop.show(p, e.getX(), e.getY());
}
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
});
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();
}
}