JCheckBoxMenuItem と JRadioButtonMenuItem

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

public class Test {
	public static void main (String[] args)
	{
		Win win = new Win("Test Window", "Test Data");
	}
}

/*******************/
/* クラスWinの定義 */
/*******************/
class Win extends JFrame implements ActionListener {

	String str = new String("");
	JTextArea ta;
	JMenu menu1, menu2, s_menu;
	JMenuItem item1, item2, item3, s_item1, s_item2, s_item3;
	JCheckBoxMenuItem c_item1, c_item2;
	JRadioButtonMenuItem r_item1, r_item2;

	/******************/
	/* コンストラクタ */
	/******************/
	Win (String name, String data)
	{
					// Frameクラスのコンストラクタ(Windowのタイトルを引き渡す)
		super(name);
					// テキストエリアの追加
		Font f = new Font("MS 明朝", Font.PLAIN, 20);
		Container cp = getContentPane();
		ta = new JTextArea(5, 25);
		ta.setFont(f);
		ta.addMouseListener(new ExitMouse());;
		cp.add(ta, BorderLayout.SOUTH);
					// メニューバー追加
		JMenuBar menu_bar = new JMenuBar();
						// 編集メニューの追加
		menu1 = new JMenu("編集");
		menu1.setFont(f);
		menu1.setMnemonic('n');
		menu_bar.add(menu1);
						// 選択メニューの追加
		menu2 = new JMenu("選択");
		menu2.setFont(f);
		menu2.setMnemonic('m');
		menu_bar.add(menu2);
						// メニューバーの設定
		setJMenuBar(menu_bar);
					// 編集メニューの内容の追加
						// 表示メニュー
		item1 = new JMenuItem("menu 1", 'm');
		item1.setIcon(new ImageIcon("budou.gif"));
		item1.addActionListener(this);
		menu1.add(item1);

		item2 = new JMenuItem("menu 2");
		item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, InputEvent.CTRL_MASK));
		item2.setIcon(new ImageIcon("sakuranbo.gif"));
		item2.addActionListener(this);
		menu1.add(item2);

		menu1.addSeparator();
						// 編集(サブメニュー)
		s_menu = new JMenu("編集");

		s_item1 = new JMenuItem("コピー");
		s_item1.addActionListener(this);
		s_item1.setEnabled(false);
		s_menu.add(s_item1);

		s_item2 = new JMenuItem("切り取り");
		s_item2.addActionListener(this);
		s_item2.setEnabled(false);
		s_menu.add(s_item2);

		s_item3 = new JMenuItem("貼り付け");
		s_item3.addActionListener(this);
		s_item3.setEnabled(false);
		s_menu.add(s_item3);

		menu1.add(s_menu);

		menu1.addSeparator();
						// メニュー(終了)
		item3 = new JMenuItem("終了");
		item3.addActionListener(this);
		menu1.add(item3);
					// 編集メニューの内容の追加
						// チェックボックス
		c_item1 = new JCheckBoxMenuItem("ボックス1");
		c_item1.addActionListener(this);
		menu2.add(c_item1);

		c_item2 = new JCheckBoxMenuItem("ボックス2");
		c_item2.addActionListener(this);
		menu2.add(c_item2);

		menu2.addSeparator();
						// ラジオボタン
		ButtonGroup gp = new ButtonGroup();

		r_item1 = new JRadioButtonMenuItem("ボタン1");
		r_item1.addActionListener(this);
		gp.add(r_item1);
		menu2.add(r_item1);

		r_item2 = new JRadioButtonMenuItem("ボタン2");
		r_item2.addActionListener(this);
		gp.add(r_item2);
		menu2.add(r_item2);
					// Windowの大きさ
		setSize(300, 350);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
	}

	/******************************/
	/* 上,左,下,右の余白の設定 */
	/******************************/
	public Insets getInsets()
	{
		return new Insets(35, 10, 10, 10);
	}

	/****************************************/
	/* マウスがTextAreaの外に出たときの処理 */
	/****************************************/
	class ExitMouse extends MouseAdapter {
		public void mouseExited(MouseEvent e)
		{
			if (ta.getSelectedText() == null)
				s_item1.setEnabled(false);
			else
				s_item1.setEnabled(true);

			if (ta.getSelectedText() == null)
				s_item2.setEnabled(false);
			else
				s_item2.setEnabled(true);

			if (str.length() == 0)
				s_item3.setEnabled(false);
			else
				s_item3.setEnabled(true);
		}
	}

	/**********************************/
	/* メニューが選択されたときの処理 */
	/**********************************/
	public void actionPerformed(ActionEvent e)
	{
		Object s = e.getSource();
					// 編集メニュー
						// メニュー1
		if (s == item1)
			ta.setText("メニュー1が選択\n");
						// メニュー2
		if (s == item2)
			ta.setText("メニュー2が選択\n");
						// 編集
		if (s == s_item1 || s == s_item2 || s == s_item3) {
			if (s == s_item1) {
				str = ta.getSelectedText();
				s_item3.setEnabled(true);
			}
			else if (s == s_item2) {
				str = ta.getSelectedText();
				int k1 = ta.getSelectionStart();
				int k2 = ta.getSelectionEnd();
				ta.replaceRange("", k1, k2);
				s_item1.setEnabled(false);
				s_item2.setEnabled(false);
				s_item3.setEnabled(true);
			}
			else {
				int k3 = ta.getCaretPosition();
				ta.insert(str, k3);
				s_item1.setEnabled(false);
				s_item2.setEnabled(false);
			}
		}
						// 終了
		if (s == item3)
			System.exit(0);
					// 選択メニュー
		if (s == c_item1 || s == c_item2 || s == r_item1 || s == r_item2) {

			ta.setText("");

			ta.append("選択されているボックス\n");
			if (c_item1.isSelected())
				ta.append("   ボックス1\n");
			if (c_item2.isSelected())
				ta.append("   ボックス2\n");

			ta.append("選択されているボタン\n");
			if (r_item1.isSelected())
				ta.append("   ボタン1\n");
			if (r_item2.isSelected())
				ta.append("   ボタン2\n");
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}
}