ITEEDU

12-5:使用JRadioButtonMenuItem组件:

JRadioButtonMenuItem的类层次结构图:
 java.lang.Object
   --java.awt.Component
    --java.awt.Container
      --javax.swing.JComponent
       --javax.swing.AbstractButton
        --javax.swing.JMenuItem
         --javax.swing.JRadioButtonMenuItem

与JCheckBoxMenuItem相同,JRadioButtonItem也是继承JMenuItem,因此JRadioButtonMenuItem也具备JMenuItem的许多特性.而 JRadioButtonMenuItem和JCheckBoxMenuItem一样也是一种特殊的JMenuItem.我们在前面也介绍过JRadioButton组件,而 JRadioButtonMenuItem是专用在MenuItem上.我们来看看JRadioButtonMenuItem的构造方法,如下表:

JRadioButtonMenuItem的构造函数:
  • JRadioButtonMenuItem():建立一个新的JRadioButtonMenuItem.
  • JRadioButtonMenuItem(Action a):建立一个支持Action的新的JRadioButtonMenuItem.
  • JRadioButtonMenuItem(Icon icon):建立一个有图标的JRadioButtonMenuItem.
  • JRadioButtonMenuItem(Icon icon,Boolean selected):建立一个有图标和设置选择状态的JRadioButtonMenuItem.
  • JRadioButtonMenuItem(String text):建立一个有文字的JRadioButtonMenuItem.
  • JRadioButtonMenuItem(String text,Boolean selected):建立一个有文字和设置选择状态的JRadioButtonMenuItem.
  • JRadioButtonMenuItem(String text,Icon icon):建立一个有文字和图标的JRadioButtonMenuItem.
  • JRadioButtonMenuItem(String text,Icon icon,Boolean selected):建立一个有文字,图标和设置状态的JRadioButtonMenuItem.

12-5-1:构造JRadioButtonMenuItem组件:

由一表可以看出JRadioButtonMenuItem的构造方式与JCheckBoxMenuItem构造方式几乎相同,而且和JCheckBoxMenuItem的构造方 式一样都是比JMenuItem的构造方式多了设置选择状况的构造方式,设置选择状态就是决定是否要将构造好的JRadioButtonMenuItem 设置为默认值.我们来看下面这个范例:

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

public class JRadioButtonMenuItem1 extends JFrame implements ActionListener {

	JTextArea theArea = null;

	public JRadioButtonMenuItem1() {

		super("JRadioButtonMenuItem1");
		theArea = new JTextArea();
		theArea.setEditable(false);
		getContentPane().add(new JScrollPane(theArea));
		JMenuBar MBar = new JMenuBar();
		MBar.setOpaque(true);

		JMenu mfile = buildFileMenu();
		JMenu mstyle = buildStyleMenu();

		MBar.add(mfile);
		MBar.add(mstyle);
		setJMenuBar(MBar);
	}// end of JRadioButtonMenuItem1()

	public JMenu buildFileMenu() {

		JMenu thefile = new JMenu("File");
		thefile.setMnemonic('F');

		JMenuItem newf = new JMenuItem("New", new ImageIcon("icons/new24.gif"));
		JMenuItem open = new JMenuItem("Open",
				new ImageIcon("icons/open24.gif"));
		JMenuItem close = new JMenuItem("Close", new ImageIcon(
				"icons/close24.gif"));
		JMenuItem quit = new JMenuItem("Exit",
				new ImageIcon("icons/exit24.gif"));

		newf.setMnemonic('N');
		open.setMnemonic('O');
		close.setMnemonic('L');
		quit.setMnemonic('X');

		newf.setAccelerator(KeyStroke.getKeyStroke('N',
				java.awt.Event.CTRL_MASK, false));
		open.setAccelerator(KeyStroke.getKeyStroke('O',
				java.awt.Event.CTRL_MASK, false));
		close.setAccelerator(KeyStroke.getKeyStroke('L',
				java.awt.Event.CTRL_MASK, false));
		quit.setAccelerator(KeyStroke.getKeyStroke('X',
				java.awt.Event.CTRL_MASK, false));

		newf.addActionListener(this);
		open.addActionListener(this);
		close.addActionListener(this);
		quit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

		thefile.add(newf);
		thefile.add(open);
		thefile.add(close);
		thefile.addSeparator();
		thefile.add(quit);

		return thefile;
	}// end of buildFileMenu()

	public JMenu buildStyleMenu() {

		JMenu style = new JMenu("Style");
		style.setMnemonic('S');

		JRadioButtonMenuItem Left = new JRadioButtonMenuItem("Left",
				new ImageIcon("icons/left24.gif"));
		JRadioButtonMenuItem Center = new JRadioButtonMenuItem("Center",
				new ImageIcon("icons/center24.gif"));
		JRadioButtonMenuItem Right = new JRadioButtonMenuItem("Right",
				new ImageIcon("icons/right24.gif"));
		JRadioButtonMenuItem Justify = new JRadioButtonMenuItem("Justify",
				new ImageIcon("icons/justify24.gif"));

		Left.setMnemonic('L');
		Center.setMnemonic('E');
		Right.setMnemonic('R');
		Justify.setMnemonic('J');

		Left.setAccelerator(KeyStroke.getKeyStroke('L',
				java.awt.Event.SHIFT_MASK, false));
		Center.setAccelerator(KeyStroke.getKeyStroke('E',
				java.awt.Event.SHIFT_MASK, false));
		Right.setAccelerator(KeyStroke.getKeyStroke('R',
				java.awt.Event.SHIFT_MASK, false));
		Justify.setAccelerator(KeyStroke.getKeyStroke('J',
				java.awt.Event.SHIFT_MASK, false));

		Left.addActionListener(this);
		Center.addActionListener(this);
		Right.addActionListener(this);
		Justify.addActionListener(this);

		style.add(Left);
		style.add(Center);
		style.add(Right);
		style.add(Justify);

		return style;
	}// end of buildStyleMenu()

	public void actionPerformed(ActionEvent ae) {
		try {
			theArea.append("* action '" + ae.getActionCommand()
					+ "' performed. *\n");
		} catch (Exception e) {
			System.out.println("actionPerformed Exception:" + e);
		}
	}

	public static void main(String[] args) {

		JFrame F = new JRadioButtonMenuItem1();
		F.setSize(400, 200);
		F.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});// end of addWindowListener
		F.setVisible(true);
	} // end of main
}// end of class JRadioButtonMenuItem1

在这个范例中我们遇到了与JRadioButton同样的问题,那就是选项的单、复选的问题.一般来说RadioButton组件是用来做单选 的情况时使用,而CheckBox则是多为复选情况时使用.那么我们该怎么来解决这个问题呢?还记得我们介绍JRadioButton时的解决方式 吗?没错,就是要利用ButtonGroup类来处理.我们在JRadioButtonMenuItem1.java的buildStyleMenu()方法中加下下列五行:

	     ButtonGroup bg=new ButtonGroup();
         bg.add(Left);
         bg.add(Center);
         bg.add(Right);
         bg.add(Justify);       

运行程序我们可看到加入ButtonGroup后的JRadioButtonMenuItem变成只能被单选的菜单.