菜单
菜单包括菜单栏和弹出式菜单,它的优点是内容丰富、层次鲜明、使用快捷,其中弹出式菜单还具有方便灵活的特点。
1.创建菜单栏
位于窗口顶部的菜单栏包括菜单名称、菜单项及子菜单。创建菜单栏的步骤:
- 创建菜单栏对象,并添加到窗体的菜单栏中。
- 创建菜单对象,并将菜单对象添加到菜单栏对象中。
- 创建菜单项对象,并将菜单项对象添加到菜单对象中。
- 为菜单项添加事件监听器,捕获菜单项被单击的事件,从而完成相应的业务逻辑。
- 如果需要,还可以在菜单中包含子菜单,即将菜单对象添加到其所属的上级菜单对象中。、
- 通常情况下一个菜单栏包括多个菜单,可以反复通过步骤 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.启用和禁用菜单项
新创建的菜单项在默认情况下是启用的,但是在某些情况下该菜单项可能不能使用。例如,在阅读器刚被打开时,在此运行中 “ 刚打开过的 ” 菜单项就应该是禁用的,如图:
可以通过方法 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());
}
}
}