在视窗式应用程序中菜单的使用是非常普遍的,Javax.swing提供的菜单功能非常强大。建立菜单要使用下面几个类:菜单条JMenuBar,菜单JMenu和菜单项JMenuItem。
在JFrame中创建菜单条很简单,使用JMenuBar的默认构建器并用setJMenuBar(JMenuBar mb)方法放置到窗体中就可。例如:
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu的构建器也很简单,只有提供菜单名就可以了,然后用add方法加入到菜单条中。例如:
JMenu filemenu = new JMenu("文件");
menuBar.add(fJMenuBarilemenu);
filemenu.addJMenuItem(菜单项或子菜单) 子菜单也是一个JMenu对象
菜单项JMenuItem是普通菜单项,此外,菜单项还可以是单选框和复选框,即JRadioButtonMenuItem和JCHeckBoxMenuItem。普通菜单项的显示内容可以是文字、图标或文字加图标。因此,JMenuItem的常用构建器是以下几种:
JMenuItem(String text) 文本式
JMenuItem(Icon icon) 图标式
JMenuItem(String text, Icon icon) 文本图标式
JMenuItem(String text,int mnemonic) 带助记符(keyboard mnemonic类)
在菜单JMenu中添加助记符必须使用setMnemonic()方法来实现。
在菜单项中还可以设置快捷键:
void setAccelerator(KeyStroke, KeyStroke)
例如:
在菜单中添加一条分隔线不用菜单项,只有用方法mennu.setSeparator()即可。
对菜单事件一般使用活动监听器,需要对每个菜单项添加。下面的例1演示创建菜单和监听菜单活动的基本方法。
例9 本程序演示创建菜单和普通菜单项以及菜单活动监听。
程序运行后的界面如图9所示。点击菜单项PG, Group和File/Open/javafile有所反应。
图9
程序的代码如下:
///
// Manu1.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
class MyFrame extends JFrame implements ActionListener{
public MyFrame() {
setTitle("普通菜单示例程序");
setSize(300, 200);
setLocation(100,100);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
myPanel = new MyPanel();
getContentPane().add(myPanel, "Center");
//新建一个菜单栏
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
//新建一个菜单对象
JMenu fileMenu = new JMenu("File");
//添加一个菜单项
fileMenu.add(new JMenuItem("New"));
//添加一个子菜单
JMenu openMenu = new JMenu("Open");
openMenu.add(new JMenuItem("TxtFile"));
openMenu.add(new JMenuItem("DocFile"));
JMenuItem javaFileItem = new JMenuItem("JavaFile");
openMenu.add(javaFileItem);
javaFileItem.addActionListener(this);
fileMenu.add(openMenu);
menuBar.add(fileMenu);
//新建一个菜单
JMenu findMenu = new JMenu("Find");
//设置助记符
findMenu.setMnemonic('F');
//新建7个不同的菜单项
findMenu.add(new JMenuItem());
ImageIcon icon = new ImageIcon("images/middle.gif");
findMenu.add(new JMenuItem(icon));
findMenu.add(new JMenuItem("File"));
findMenu.add(new JMenuItem("Directory", icon));
JMenuItem pcItem = new JMenuItem("PC", 'P');
pcItem.addActionListener(this);
findMenu.add(pcItem);
//新建一个分隔线
findMenu.addSeparator();
JMenuItem gp = new JMenuItem("Group");
//为group菜单项增加快捷键
gp.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
gp.addActionListener(this);
findMenu.add(gp);
menuBar.add(findMenu);
}
public void actionPerformed(ActionEvent evt){
if (evt.getSource() instanceof JMenuItem){
//判断事件源是否为菜单项
String itemName = evt.getActionCommand();
if (itemName.equals("JavaFile")) {
myPanel.setMsg("You've pressed menu : JavaFile");
}
else if (itemName.equals("PC")) {
myPanel.setMsg("You've pressed menu : PC");
}
else if (itemName.equals("Group")){
myPanel.setMsg("You've pressed menu : Group");
}
}
}
private MyPanel myPanel;
}
class MyPanel extends JPanel{
public MyPanel() {
szShowMsg = "";
}
public void setMsg(String szMsg) {
szShowMsg = szMsg;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(szShowMsg, 20, 20);
}
private String szShowMsg;
}
public class Menu1{
public static void main(String[] args){
JFrame frame = new MyFrame();
frame.setVisible(true);
}
}
///
简要说明
程序包括3个类Menu1,MyFrame和MyPanel。MyPanel中添加一个标签,用来显示鼠标点击某些菜单项时的反应信息。
类MyFrame是主要的,它是一个建立了菜单窗体,扩充了活动监听器ActionListener。MyFrame中实现了actionPerformed方法。
从上面的例子我们可以看到,要建立一个菜单需要写冗长而又单调的代码。如果能建立一个方法让循环语句自动生成菜单好了。我们把几菜单需要的信息如菜单名、类型、快捷键等放在对象数组中,由“创建方法”读取和识别信息并自动生成菜单。下面的例程好象一个通用菜单,包括“文件、编辑、查找、选项和帮助”五个一个菜单。您只要修改提供信息的数组内容,就可以把它变成适用于自己的菜单。
例10 通用菜单程序,由一个二维对象数组提供一个菜单及其菜单项的信息。
二维对象数组的第一个元素是菜单信息,其余的是菜单项的信息。菜单信息包括{名称,快捷键},菜单项信息包括{ "New", mi, new Character('N'), a1, bT } 即 {名称,菜单项类型,快捷键,监听器对象,是否可用}。菜单项类型有mi普通型,ch复选框,rb单选框三种静态变量。因此,“创建方法”能自动识别菜单项的类型和一个菜单中包含菜单项的个数。这就方便了使用者,只要修改数组内容就可以创建不同的菜单。
程序中定义了三个方法。
创建菜单条方法
static public JMenuBar createMenuBar(Object[] menuBarData) {
JMenuBar menuBar = new JMenuBar();
for(int i = 0; i < menuBarData.length; i++)
menuBar.add(createMenu((Object[][])menuBarData[i]));
return menuBar;
}
输入参数menuBarData数组中元素的JMenu对象。
创建菜单方法
static public JMenu createMenu(Object[][] menuData) {
JMenu menu = new JMenu();
menu.setText((String)menuData[0][0]);
menu.setMnemonic(((Character)menuData[0][1]).charValue());
// Create redundantly, in case there are
// any radio buttons:
bgroup = new ButtonGroup();
for(int i = 1; i < menuData.length; i++) {
if(menuData[i][0] == null)
menu.add(new JSeparator());
else
menu.add(createMenuItem(menuData[i]));
}
return menu;
}
菜单名称由首元素menuData[0][0]提供,利用menuData[i]的数据生成菜单项。
创建菜单项方法
static public JMenuItem createMenuItem(Object[] data) {
JMenuItem m = null;
MType type = (MType)data[1];
if(type == mi)
m = new JMenuItem();
else if(type == cb)
m = new JCheckBoxMenuItem();
else if(type == rb) {
m = new JRadioButtonMenuItem();
bgroup.add(m);
}
m.setText((String)data[0]);
m.setMnemonic(((Character)data[2]).charValue());
m.addActionListener((ActionListener)data[3]);
m.setEnabled(((Boolean)data[4]).booleanValue());
if(data.length == 6) //第6个元素的图标
m.setIcon((Icon)data[5]);
return m;
}
程序先根据data[1]判断类型以便生成不同的菜单项,然后设置其他各项,最后返回JMenuItem对象。程序运行后的界面如图10所