Java AWT菜单

来源:互联网 发布:岂可得乎 编辑:程序博客网 时间:2024/05/16 10:43

创建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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void mouseReleased(MouseEvent e) {// 如果释放的是鼠标右键if (e.isPopupTrigger()) {pop.show(p, e.getX(), e.getY());}}@Overridepublic void mouseClicked(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic 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();}}


0 0
原创粉丝点击