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

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Java | 39 | 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ボタンが表示されます。(ポップアップメニュー)


SwingMenu.java実行結果
SwingMenu.java実行結果


表示されるフレーム
表示されるフレーム


↓↓クリックして頂けると励みになります。


<<前  [TOP]  次>>