学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その40 JToggleButtonを利用したプログラム

<<前  [TOP]  次>>


今回はメニュー関係として、JMenuBar, JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem, JToolBar, JPopupMenuを使用します。
下記にクラスの関係をあげておきます。


【クラス階層】

java.lang.Object
    +--java.awt.Component
        +--java.awt.Container
            +--javax.swing.JComponent
                |
                +--javax.swing.JToolBar
                +--javax.swing.JPopupMenu
                +--javax.swing.JMenuBar
                +--javax.swing.AbstractButton
                    |
                    +--javax.swing.JButton
                    +--javax.swing.JToggleButton
                    +--javax.swing.JMenuItem
                        |
                        +--javax.swing.JMenu
                        +--javax.swing.JCheckBoxMenuItem
                        +--javax.swing.JRadioButtonMenuItem



では、以下のサンプルプログラムを作成してみましょう。


SwingMenu.java 直

/**
*メニューとポップアップメニュー、ツールバーを利用
*/

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

public class SwingMenu extends JPanel implements ActionListener, MouseListener {

	private final int WIDTH = 400; //JPanelの幅と高さを定義
	private final int HEIGHT = 200;
	private final int WHITE = 0;
	private final int BLACK = 1;

	private boolean clearFlag;
	private int colorFlag;

	private JMenuBar menuBar;
	private JMenuItem drawItem1, drawItem2, drawItem3;
	private JMenuItem quitItem, whiteItem,blackItem;
	private JCheckBoxMenuItem cbOval, cbRect;
	private JRadioButtonMenuItem rbOn, rbOff;
	private ImageIcon icon1, icon2;
	private JToggleButton imageButton;
	private JToolBar toolBar;
	private JPopupMenu popup;

	/** コンストラクタ*/
	public SwingMenu() {
		setPreferredSize(new Dimension(WIDTH, HEIGHT));

		//イメージの生成
		icon1 = new ImageIcon("char0.gif");
		icon2 = new ImageIcon("char6.gif");

		//メニューバーの生成
		menuBar = new JMenuBar();

		//開始・クリア(サブメニュー)・終了を生成
		JMenu programMenu = new JMenu("Program");

		//イメージを表示するボタンを生成
		imageButton = new JToggleButton(icon1);
		imageButton.setRolloverIcon(icon2); //反転中に表示するアイコン

		//JMenuItemの生成
		drawItem1 = new JMenuItem("Draw!!");

		//クリアサブメニューの内容を生成
		JMenu clearMenu = new JMenu("clear");
		whiteItem = new JMenuItem("White");
		blackItem = new JMenuItem("Black");

		clearMenu.add(whiteItem);
		clearMenu.add(blackItem);

		quitItem = new JMenuItem("Quit");

		programMenu.add(imageButton);
		programMenu.add(drawItem1);
		programMenu.add(clearMenu);

		programMenu.addSeparator(); //区切りを入れる
		programMenu.add(quitItem);

		//図形メニューを生成
		JMenu zukeiMenu = new JMenu("zukei:");

		//チェックボックス式のメニューアイテム
		cbOval = new JCheckBoxMenuItem("Oval", true);
		cbRect = new JCheckBoxMenuItem("Rect");

		cbRect.setSelected(true);

		zukeiMenu.add(cbOval);
		zukeiMenu.add(cbRect);

		//塗りつぶしのメニューを生成
		JMenu drawMenu = new JMenu("Draw:");

		//ラジオボタン式のメニューアイテム
		rbOn = new JRadioButtonMenuItem("On", true);
		rbOff = new JRadioButtonMenuItem("Off",false);

		drawMenu.add(rbOn);
		drawMenu.add(rbOff);

		//グループ化
		ButtonGroup group = new ButtonGroup();
		group.add(rbOn);
		group.add(rbOff);

		//メニューバーに登録
		menuBar.add(programMenu);
		menuBar.add(zukeiMenu);
		menuBar.add(drawMenu);

		//ツールバーの生成
		toolBar = new JToolBar();

		//ツールバーに登録
		drawItem2 = new JMenuItem("Draw!!");
		drawItem2.setToolTipText("Draw");
		toolBar.add(drawItem2);
        	
		//ポップアップメニューの生成
		popup = new JPopupMenu("Popup Menu");
		drawItem3 = new JMenuItem("Draw!!");
		popup.add(drawItem3);

		//イベントの通知を登録
		drawItem1.addActionListener(this);
		drawItem2.addActionListener(this);
		drawItem3.addActionListener(this);

		quitItem.addActionListener(this);

		whiteItem.addActionListener(this);
		blackItem.addActionListener(this);

		rbOn.addActionListener(this);
		rbOff.addActionListener(this);

		//ポップアップメニューを開くためにイベントの通知を登録
		addMouseListener(this);

		//フラグの初期化
		clearFlag = false;
		colorFlag = WHITE;
	}

	/**グラフィックス描画処理*/
	public void paintComponent(Graphics g) {

		//画面クリア
		if(colorFlag == WHITE) {
			g.setColor(Color.white);
		}
		else {
			g.setColor(Color.black);
		}
		g.fillRect(0, 0, WIDTH, HEIGHT);

		//「クリアされた場合の処理はここまで 
		if(clearFlag == true) {
			clearFlag = false;
			return;
		}

		//図形の描画
		g.setColor(Color.red);

		//チェックボックスなどと同様に[isSelected()]で状態を確認
		if(cbOval.isSelected() == true) {
			g.fillOval((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT-50)), 50, 50);
		}
		g.setColor(Color.green);

		if(cbRect.isSelected() == true) {
			g.fillRect((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT-50)), 50, 50);
		}
	}

	/**ボタン(メニューアイテム)でイベントが発生した時の処理*/
	public void actionPerformed(ActionEvent evt) {

		//発生したイベント情報からアクション・コマンドを用いて、
		//「発生したコンポーネント」を調べる
		String action = evt.getActionCommand();

		if(action.equals("Draw!!")) {
			repaint();
		}
		else if(action.equals("On")) {
			drawItem1.setEnabled(true);
			drawItem2.setEnabled(true);
		}
		else if(action.equals("Off")) {
                        drawItem1.setEnabled(false);
                        drawItem2.setEnabled(false);
                }
		else if(action.equals("White")) {
			colorFlag = WHITE;
			clearFlag = true;
			repaint();
                }
		else if(action.equals("Black")) {
                        colorFlag = BLACK;
                        clearFlag = true;
                        repaint();
                }
		else if(action.equals("Quit")) {
			System.exit(0);
		}
	}

	/**マウスイベントが発生した時の(ポップアップメニュー)処理*/
	public void mousePressed(MouseEvent evt) {

		popupShow(evt);
	}

	public void mouseReleased(MouseEvent evt) {
		popupShow(evt);
	}

	public void mouseClicked(MouseEvent evt) {
                popupShow(evt);
        }

	/**その他のマウスイベント*/
	public void mouseEntered(MouseEvent evt) {}
	public void mouseExited(MouseEvent evt) {}

	/**ポップアップメニューを表示させるのに適切な動作があった場合のみ表示*/
	public void popupShow(MouseEvent evt) {

		if(evt.isPopupTrigger()) {
			popup.show(this, evt.getX(), evt.getY());
		}
	}

	/**main()*/
	public static void main(String[] args) {

		SwingMenu panel = new SwingMenu();

		JFrame frame = new JFrame("SwingMenu");

		//[閉じる]ボタンで終了
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

		//コンテンツ・ぺインにパネルとツールバーを設定
		frame.getContentPane().add(panel.toolBar, "North");
		frame.getContentPane().add(panel, "Center");

		//メニューバーの設定
		frame.setJMenuBar(panel.menuBar);
		frame.pack();
		frame.setVisible(true);
	}
}



なお、このプログラムを実行するには、以下の「char0.gif」「char6.gif」が必要ですので、プログラムを作成するフォルダに保存しておいてください。
char0.gif 直
char6.gif 直


「JMenuBar」は、各種メニューを格納するメニューバーで、フレームに設定されます。メニューバーの表示位置を指定する必要はありません。
JFrameのsetMenuBar()を利用してフレー一ムに設定します。
設定方法は、以下の通りです。

JFrame frame = new Frame("テストフレーム");
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);



「JMenu」は、各種メニューアイテムを保持するポップアップ・ウィンドウです。
実際のメニューアイテムはJMenuに登録して使用します。
JMenuは、JMenuItemの子クラスなので、JMenuItemの機能も持っています。


メニューがJMenuBar上にあれば、トップレベル・ウィンドウということになります。
また、メニューの中にさらに別のメニューを入れることも可能です。
そのメニューを選択した場合は「プルライト」(選択した右側へ表示)なメニューになります。.


JMenuをJMenuBarへaddした場合、順に左から登録されます。
また、サブメニューをaddした場合は、各種メニューアイテムも同列に、add順に上から登録されます。
さらに、addSeparator()を用いることで、「区切り線」を入れることも可能です。

JMenuBar menuBar = new JMenuBar();

JMenu menu1 = new JMenu("メニュー1");
JMenu menu2 = new JMenu("メニュー2");

JMenu subMenu1 = new JMenu("サブメニュー1");
JMenu subMenu2 = new JMenu("サブメニュー2");

//menu1にサブメニューを2つ登録。上から順に並ぶ。
//サブメニューの間には区切り線が入る。
//通常は、後述するように、各種メニューアイテムをaddする。
menu1.add(subMenu1);
menu1.assSeparator();

//メニューをメニューバーに登録。左から順に並ぶ。
menuBar.add(menu1);
menuBar.add(menu2);



「JMenuItem」は、各種メニューアイテムの基本となる選択項目です。
メニューに置かれている「ボタン」と見ることができます。
AbstractButtonから派生した他クラスと同様に、テキストとアイコンでメニューアイテムを生成することができます。
生成したメニューアイテムは、JMenuに登録します。

ImageIcon icon = new ImageIcon("sample.gif");
JMenu menu = new JMenu("メニュー");
JMenuItem item1 = new JMenuItem("アイテム1");
JMenuItem item2 = new JMenuItem("アイテム2", icon);
//menuにメニューアイテムを登録。上から順に並ぶ。区切り線が入っている
menu.add(item1);
menu.addSeparator();
menu.add(item2);



「JCheckBoxItem」は、選択か選択解除ができるメニューアイテムです。
基本機能はJMenuItemを継承します。


生成時に選択あるいは選択解除を設定することも可能です。
後で、設定するにはsetSelected()を利用してください。


他のAbstractButtonと同様に、setSelectedOでメニュー項目の状態を設定できます。
また、isSelected()でメニュー項目の選択状態を判定できます。


生成したメニューアイテムは、JMenuに登録します。

ImageIcon icon = new ImageIcon("sample.gif");
JMenu menu = new JMenu("メニュー");
JCheckBoxMenuItem cbItem1 = new JCheckBoxItem("アイテム1");
JCheckBoxMenuItem cbItem2 = new JCheckBoxItem("アイテム2", icon, true);

//menuにメニューアイテムを登録。上から順に並ぶ。
menu.add(cbItem1);
menu.add(cbItem2);



「JRadioButtonItem」は、メニューでラジオボタンを扱えるメニューアイテムです。
基本機能はJMenuItem槻を継承します。


JCheckBoxMenuItemと同様に生成時に選択か選択解除を設定することも可能ですし、状態のチェック方法も同じように行えます。
グループ化するには、JRadioButtonと同様にButtonGroupクラスを利用します。
生成したメニューアイテムは、JMenuに登録します。

ImageIcon icon = new ImageIcon("sample.gif");
JMenu menu = new JMenu("メニュー");

JRadioButtonMenuItem rbItem1 = new JRadioButtonMenuItem("Item1");
JRadioButtonMenuItem rbItem2 = new JRadioButtonMenuItem("Item2", icon, ture);

//menuにメニューアイテムを登録。上から順に並ぶ。
menu.add(rbItem1);
menu.add(rbItem2);

//表示(メニューへの登録)とは別に、ボタングループヘ登録
ButtonGroup group = new ButtonGroup();
group.add(rbItem1);
group.add(rbItem2); 



「JToolBar」は、メニューから選択できる項目を、あらかじめ見えるところに配置しておくものです。
通常、「終了」項目はツールバーにしません。
ツールバーは、ユーザーが自由な位置へ移動させることができます。


ツールバーに、ボタンやメニューアイテムを登録するには、他のコンテナと同様に、add()すれば良いです。


また、ツールバーをフレームに設定する場合も、他のコンテナと同様に、コンテンツ・ペインのいずれかへ配置します。
このとき、ツールバーの移動を適切に機能させるためには、BorderLayout(フレームの初期レイアウト)の上下左右にツールバーを設定して、その他の辺には何も置かない方がより安全です。
設定方法は、以下の通りです。

JFrame frame = new Frame("テストフレーム");
JToolBar toolBar = new JToolBar();
JMenuItem item = new JMenuItem("アイテム");
toolBar.add(item);
frame.getContentPane().add(toolBar, "North"); 



「JPopupMenu」は、画面上の任意の位置に表示されるメニューです。
ポップアップメニューの中の項目作成は、JMenuと同様に行うことが可能です。


さらに、addSeparator()を用いることで、「区切り線」を入れることも可能です。

//JPopupMenu("ラベル");として生成することも出来るが、
//現在「ラベル」も表示するポップアップメニューは無い
JPopupMenu popup = new JPopupMenu();
JMenuItem item1 = new JMenuItem("アイテム1");
JMenuItem item2 = new JMenuItem("アイテム2");

//メニューアイテムをポップアップメニューに登録。区切り線も入れる
popup.add(item1);
popup.addSeparator();
popup.add(item2);



JPopupMenuの表示は、マウスイベントによって実現されるのが普通です。
java.awt.MouseListenerの実装するメソッドは5種類です。


イベントはMouseEventです。
ただし、ポップアップメニューは、マウスの一番右のボタンを押すことで表示するのが一般的です。
この処理のために、MouseEvent.isPopupTrigger()を利用することを勧めます。
isPopupTrigger()はそのシステムでポップアップに適したマウスボタンの操作を感知してくれるものです。
しかし、どのタイミング(マウスのボタンが押されたときか、放されたときか〉でisPopupTrigger()が発生するかは、システムによって異なるので、MouseListenerで実装するメソッドのうち、「mousePressed()」「mouseReleased()」「mouseClicked()」には全て、isPopupTrigger()の判定を入れておいた方が良いです。


表示は、JPopupMenu.show()を使用するのがお勧めです。
setVisible())で表示の制御もできますが、不可視の処理も記述しないといけません。
下記の例では、「popup.show(panel, evt.getX(), evt.getY());」となっています。
第1引数は、どのコンポーネント上に表示させるかを示します。
この場合はパネル上ということになります。
第2・3引数は表示させるポップアップメニューの左上のx,y座標です。
この場合、マウスカーソルの位置をもとに表示させます。

JPanel panel = new JPanel();
 //マウスのイベント処理のために登録
panel.addMouseListener(this);

 /**マウスイベントが発生したときの処理*/
public void mousePressed(MouseEvent evt) {
    popupShow(evt);    //内容は共通なのでメソッド化して、それを呼び出す
}
public void mouseReleased(MouseEvent evt) {
    popupShow(evt);
}
public void mouseClicked(MouseEvent evt) {
    popupShow(evt);
}
public void mouseClicked(MouseEvent evt) {
    popupShow(evt);
}
/** その他のマウスイベント*/
public void mouseEntered(MouseEvent evt) { }
public void mouseExited(MouseEvent evt) { }

/** ポップアップメニューを表示させるのに適切な動作があった場合のみ表示*/
public void popupShow(MouseEvent evt) {
    if(evt.ispopupTrigger() == true) {
        popup.show(panel, evt.getX(), evt.getY());
    }
}



では、サンプルプログラムを実行してみましょう。
programメニューの中には、反転させる(マウスのカーソルをのせる)とアイコンが変わるボタン、クリアメニュー、Drawボタンなどがあります。
他にも、多々メニューがあり、ラジオボタンでON, OFFを切り替えられるものもあります。
フレーム上で右クリックすると、Drawボタンが表示されます。(ポップアップメニュー)








<<前  [TOP]  次>>