Java AWT菜单

创建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();
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值