菜单

菜单包括菜单栏和弹出式菜单,它的优点是内容丰富、层次鲜明、使用快捷,其中弹出式菜单还具有方便灵活的特点。

1.创建菜单栏

位于窗口顶部的菜单栏包括菜单名称、菜单项及子菜单。创建菜单栏的步骤:

  1. 创建菜单栏对象,并添加到窗体的菜单栏中。
  2. 创建菜单对象,并将菜单对象添加到菜单栏对象中。
  3. 创建菜单项对象,并将菜单项对象添加到菜单对象中。
  4. 为菜单项添加事件监听器,捕获菜单项被单击的事件,从而完成相应的业务逻辑。
  5. 如果需要,还可以在菜单中包含子菜单,即将菜单对象添加到其所属的上级菜单对象中。、
  6. 通常情况下一个菜单栏包括多个菜单,可以反复通过步骤 2-5 向菜单栏中添加。

JMenuBar 类来创建菜单栏。类中常用 的方法有add(JMenu c) 和 isSelected(), add(JMenu c) 方法用来向菜单栏中添加菜单对象; isSelected() 方法用来查看菜单栏是否处于被选中的状态,即是否已经选择了菜单栏中的菜单项或子菜单项。如果处于被选中状态则返回 true ,否则返回 false。
JMenu 类用来创建菜单,菜单用来添加菜单项和子菜单,从而实现对菜单项的分类管理。这个类除了拥有默认的没有入口参数的构造方法之外,还有一个常用的构造方法 JMenu(String s),用来创建一个指定名称的菜单。
JMenu 常用的方法:

方法

说明

add(JMenuItem menuItem)

向菜单中添加菜单项和子菜单

add(String s)

向菜单中添加指定名称的菜单项。该方法的返回值为添加的菜单项对象,以便对菜单项进行设置,如为菜单项添加事件监听器

insert(JMenuItem mi , int pos)

向指定位置插入菜单项

insert(String s , int pos)

向指定位置插入指定名称的菜单项。需要注意的是,该方法并不返回插入的菜单项对象

getMenuCompoentCount()

获得菜单中包含的组件树,组件包括菜单项、子菜单和分隔线

isTopLeveMenu()

查看菜单是否为顶层菜单,即是否为添加菜单栏对象中的菜单对象,如果是则返回 true,否则返回 false

isMenuComponent(Component c)

查看指定菜单项或子菜单是否包含在该菜单中

例:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class ExampleFrame_05 extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {
		ExampleFrame_05 frame = new ExampleFrame_05();
		frame.setVisible(true);
	}

	public ExampleFrame_05() {
		super();
		setTitle("创建菜单栏");
		setBounds(100, 100, 500, 375);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JMenuBar menuBar = new JMenuBar();// 创建菜单栏对象
		setJMenuBar(menuBar);// 将菜单栏对象添加到窗体中

		JMenu menu = new JMenu("菜单名称");// 创建菜单对象
		menuBar.add(menu);// 将菜单对象添加到菜单栏对象

		JMenuItem menuItem = new JMenuItem("菜单项名称");// 创建菜单项对象
		menuItem.addActionListener(new ItemListener());// 为菜单项添加事件监听
		menu.add(menuItem);// 将菜单项添加到菜单对象中

		JMenu soMenu = new JMenu("子菜单名称");// 创建菜单的子菜单对象
		menu.add(soMenu);// 将子菜单对象添加到上一级菜单对象

		JMenuItem soMenuItem = new JMenuItem("子菜单项名称");// 创建子菜单项名称对象
		soMenuItem.addActionListener(new ItemListener());// 为菜单项添加事件监听器
		soMenu.add(soMenuItem);

		JMenu somenu2 = new JMenu("菜单名称2");// 创建菜单对象
		menuBar.add(somenu2);// 将菜单对象添加到菜单栏对象中

		JMenuItem menuItem2 = new JMenuItem("子菜单项名称2");// 创建菜单的子菜单对象
		menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
		somenu2.add(menuItem2);// 将子菜单大的菜单项对象添加到子菜单对象中

	}

	private class ItemListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			JMenuItem meuItem = (JMenuItem) e.getSource();
			System.out.println("您单击的是菜单项:" + meuItem.getText());
		}
	}
}

2.定制个性化菜单

在设计菜单时,只是简单地使用类似按钮的菜单项是不够的,因为这样的菜单既不美观,又不实用。
1.使用分隔线和图标
在定制菜单时,通常将功能相似或者想关的菜单项放在一起,然后用分隔线将它们与其他的菜单项隔开,这样用户在使用时会更加方便和直观。JMenu 类的 addSeparator() 和 insertSeparator(int index) 方法均用来向菜单中添加分隔线,addSeparator() 方法用来向指定索引位置插入分隔线,索引值从0开始。
2.设置快捷键和加速器
为菜单和菜单项设置快捷键均通过 setMnemonic(int mneoic) 或 setMnemonic(char mnemonic) 方法实现。setMnemonic(int mneoic) 方法的入口参数为与键盘助记符对应的键值,可以是键盘上的任意键,可以通过 java.awt.even.KeyEvent 类中定义的以 “ VK_”开头的静态常量指定; setMnemonic(char mnemonic) 方法的入口参数为键盘助记符,该方法仅支持 A~Z 的键盘设置为快捷键。
菜单项还支持设置加速器。在使用加速器时菜单并不被展开,它只是直接激活相应菜单项对应的事件。为菜单项设置加速器通过 setAccelerator(KeyStroke keyStorke) 方法实现,该方法接收 KeyStorke 类的对象,可以通过静态方法 getKeyStorke(int keyCode, int modifiers) 获得该类的对象。入口参数 keyCode 为键值,可以通过 KeyEvent 类中定义的以 “ VK_” 开头的静态常量指定;入口参数 modifiers 为一组修饰符,可以为下面的一个或多个,如果是多个,则用 “ | ” 隔开。
java.awt.event.InputEvent.CTRL_MASK
java.awt.event.InputEvent.ATL_MASK
java.awt.event.InputEvent.SHIFT_MASK
java.awt.event.InputEvent.META-MASK

3.使用单选按钮和复选框菜单项

在定制菜单时,也可以将单选按钮和复选按钮菜单项添加到菜单中,它们在有些情况下会更适用。
复选框菜单项通过 JCheckBoxMenuItem 类实现,单选按钮菜单项通过 JRadioButtonMenuItem 类实现,
单选按钮菜单项通过 JRadioButtonMenuItem 类实现,这两个类均继承了 JMenuItem 类,所以针对普通菜单项的设置对这两个菜单项均适用。

4.启用和禁用菜单项

新创建的菜单项在默认情况下是启用的,但是在某些情况下该菜单项可能不能使用。例如,在阅读器刚被打开时,在此运行中 “ 刚打开过的 ” 菜单项就应该是禁用的,如图:

java swing菜单放在底部 swing菜单栏_swing


可以通过方法 setEnabled(boolean b) 设置菜单项的启用或者禁用状态,如果设为 true ,则表示启用菜单项,设为 false 则表示禁用菜单项,也可以通过该方法启用或者禁用菜单。

例:

import static java.awt.event.InputEvent.*;
import static java.awt.event.KeyEvent.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;

public class ExampleFrame_07 extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	final ButtonGroup buttonGroup = new ButtonGroup();

	public static void main(String[] args) {
		ExampleFrame_07 frame = new ExampleFrame_07();
		frame.setVisible(true);
	}

	public ExampleFrame_07() {
		super();
		setBounds(100, 100, 500, 375);
		setTitle("定制个性化菜单");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		final JMenu fileMenu = new JMenu("文件(F)");// 创建‘文件’菜单
		fileMenu.setMnemonic('F');// 设置快捷键
		menuBar.add(fileMenu);// 添加到菜单

		final JMenuItem newItem = new JMenuItem("新建(N)");// 创建菜单项
		newItem.setMnemonic('N');// 设置快捷键
		// 设置加速器为‘Ctrl+N’
		newItem.setAccelerator(KeyStroke.getKeyStroke(VK_N, CTRL_MASK));
		newItem.addActionListener(new ItemListener());// 添加动作监听器
		fileMenu.add(newItem);// 添加到‘文件’菜单

		final JMenu openMenu = new JMenu("打开(O)");// 创建‘打开’子菜单
		openMenu.setMnemonic('O');// 设置快捷键
		fileMenu.add(openMenu);// 添加到‘文件’菜单
		// 创建子菜单项
		final JMenuItem openNewItem = new JMenuItem("未打开过得(N)");
		openNewItem.setMnemonic('N');// 设置快捷键
		// 设置加速器为‘Ctrl+Alt+N’
		openNewItem.setAccelerator(KeyStroke.getKeyStroke(VK_N, CTRL_MASK | ALT_MASK));
		openNewItem.addActionListener(new ItemListener());// 添加动作监听器
		openMenu.add(openNewItem);// 添加到‘打开’子菜单

		// 创建子菜单
		JMenuItem openCloseItem = new JMenuItem("刚打开过的(C)");
		openCloseItem.setMnemonic('C');// 设置快捷键
		// 设置加速器
		openCloseItem.setAccelerator(KeyStroke.getKeyStroke(VK_C, CTRL_MASK | ALT_MASK));
		openCloseItem.setEnabled(false);// 禁用菜单项
		// 添加动作监听器
		openCloseItem.addActionListener(new ItemListener());
		openMenu.add(openCloseItem);// 添加到‘打开’子菜单
		fileMenu.addSeparator();// 添加分隔线

		final JMenuItem saveItem = new JMenuItem("保存(S)");
		saveItem.setMnemonic('S');
		saveItem.setAccelerator(KeyStroke.getKeyStroke(VK_S, CTRL_MASK));
		saveItem.addActionListener(new ItemListener());
		fileMenu.add(saveItem);// 添加到‘文件’菜单
		
		fileMenu.addSeparator();

		final JMenuItem exitItem = new JMenuItem("退出(E)");
		exitItem.setMnemonic('E');
		exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK));
		exitItem.addActionListener(new ItemListener());
		fileMenu.add(exitItem);
		

		final JMenu editMenu = new JMenu("编辑(E)");
		editMenu.setMnemonic('E');
		menuBar.add(editMenu);

		URL resource = this.getClass().getResource("/img.JPG");
		ImageIcon icon = new ImageIcon(resource);

		final JMenuItem cutItem = new JMenuItem("剪切(T)");
		cutItem.setIcon(icon);
		cutItem.setMnemonic('T');
		cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_MASK));
		cutItem.addActionListener(new ItemListener());
		editMenu.add(cutItem);

		final JMenuItem copyItem = new JMenuItem("复制(C)");
		copyItem.setIcon(icon);
		copyItem.setMnemonic('C');
		copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
		copyItem.addActionListener(new ItemListener());
		editMenu.add(copyItem);

		final JMenuItem pastItem = new JMenuItem("粘贴(P)");
		pastItem.setIcon(icon);
		pastItem.setMnemonic('P');
		pastItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
		pastItem.addActionListener(new ItemListener());
		editMenu.add(pastItem);

		editMenu.addSeparator();
		editMenu.insertSeparator(2);

		final JMenu fontMenu = new JMenu("字体(F)");// 创建‘字体’菜单
		fontMenu.setIcon(icon);// 设置图标
		fontMenu.setMnemonic('F');// 设置快捷键
		editMenu.add(fontMenu);// 添加到‘编辑’栏

		final JCheckBoxMenuItem bCheckBoxMenuItem = new JCheckBoxMenuItem("加粗(B)");// 创建复选框菜单项
		bCheckBoxMenuItem.setMnemonic('B');// 设置快捷键
		bCheckBoxMenuItem.setAccelerator(KeyStroke.getKeyStroke(VK_B, CTRL_MASK | ALT_MASK));// 设置加速器为‘Ctrl+Alt+B’
		bCheckBoxMenuItem.addActionListener(new ItemListener());// 添加动作监听器
		fontMenu.add(bCheckBoxMenuItem);// 添加到‘字体’子菜单

		final JCheckBoxMenuItem iCheckBoxMenuItem = new JCheckBoxMenuItem("斜体(I)");// 创建复选框菜单项
		iCheckBoxMenuItem.setMnemonic('I');
		iCheckBoxMenuItem.setAccelerator(KeyStroke.getKeyStroke(VK_I, CTRL_MASK | ALT_MASK));// 设置加速器为‘Ctrl+Alt+I’
		iCheckBoxMenuItem.addActionListener(new ItemListener());// 添加动作监听器
		fontMenu.add(iCheckBoxMenuItem);

		editMenu.addSeparator();

		final JMenu attributeMenu = new JMenu("属性(A)");// 创建‘属性’菜单
		attributeMenu.setIcon(icon);// 设置图标
		attributeMenu.setMnemonic('A');// 设置快捷键
		editMenu.add(attributeMenu);// 添加到‘编辑’菜单

		JRadioButtonMenuItem rRadioButtonMenuItem = new JRadioButtonMenuItem("只读(R)");// 创建单选按钮菜单项
		rRadioButtonMenuItem.setMnemonic('R');// 设置快捷键
		rRadioButtonMenuItem.setAccelerator(KeyStroke.getKeyStroke(VK_R, CTRL_MASK | ALT_MASK));// 设置加速器‘Ctrl+Alt+R’
		rRadioButtonMenuItem.addActionListener(new ItemListener());// 添加动作监听器
		attributeMenu.add(rRadioButtonMenuItem);// 添加到‘属性’子菜单

		final JRadioButtonMenuItem eRadioButtonMenuItem = new JRadioButtonMenuItem("编辑(E)");// 创建单选按钮菜单项
		eRadioButtonMenuItem.setMnemonic('E');
		eRadioButtonMenuItem.setAccelerator(KeyStroke.getKeyStroke(VK_E, CTRL_MASK | ALT_MASK));// 设置加速器为‘Ctrl+Alt+E’
		buttonGroup.add(eRadioButtonMenuItem);
		eRadioButtonMenuItem.addActionListener(new ItemListener());// 添加动作监听器
		attributeMenu.add(eRadioButtonMenuItem);// 添加到‘属性’子菜单

		final JMenu helpMenu = new JMenu("帮助(H)", false);//
		helpMenu.setText("帮助(H)");
		helpMenu.setMnemonic('H');
		menuBar.add(helpMenu);

		final JMenuItem aboutMenuItem = new JMenuItem("关于(A)");
		aboutMenuItem.setMnemonic('A');
		aboutMenuItem.addActionListener(new ItemListener());
		helpMenu.add(aboutMenuItem);

	}

	public class ItemListener implements ActionListener {//动作事件监听器

		@Override
		public void actionPerformed(ActionEvent e) {
			JMenuItem source = (JMenuItem) e.getSource();
			System.out.println("您单击的菜单项:" + source.getText());
		}

	}
}