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

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

Javaプログラミング入門その39 いろいろなボタンを利用したプログラム

<<前  [TOP]  次>>


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


SwingToggle1.java 直

/**
*JToggleButtonを表示する。
*/

import javax.swing.*;

public class SwingToggle1 {

	private JToggleButton button1, button2;

	/**コンストラクタ*/
	public SwingToggle1(){

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

		//ボタンの生成
		button1 = new JToggleButton("Button1", icon);
		button2 = new JToggleButton("Button2", true);

	}

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

		SwingToggle1 toggle = new SwingToggle1();

		JFrame frame = new JFrame("Toggle1");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.getContentPane().add(toggle.button1, "West");
		frame.getContentPane().add(toggle.button2, "East");
		frame.pack();
		frame.setVisible(true);
	}
}



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


トグルボタンとは「選択」「選択解除」の2つの状態をもつボタンです。
SwlngではJToggleButtonで使用します。
JToggleButtonはJCheckBox(チェックボックス)とJRadioButton(ラジオボタン)の基本クラス(親クラス)にあたりますが、JToggleButtonとして使用することも可能です。
JToggleButtonの親クラスはJButtonと同じAbstractButtonですので、JButtonと同様に、ボタンにテキストやアイコン(あるいはその両方)を表示させることができます。


生成例をあげておきます。
JToggleButtonの初期設定は「選択解除」状態です。
最初から「選択」状態にするには、Button4のように生成時に「true」を加えてください。

JToggleButton button1 = new JToggleButton("これはボタンです");
ImageIcon icon = new ImageIcon("sample.gif");
JToggleButton button2 = new JToggleButton(icon);
JToggleButton button3 = new JToggleButton("これはボタンです", icon);
JToggleButton button4 = new JToggleButton("これはボタンです", true);



また、生成した後にボタンの「選択」「選択解除」状態を変更するには、AbstractButton
で定義されている「setSelectedO」メソッドを用いてください。

JToggleButton button1 = new JToggleButton("これはボタンです");
button1.setSelected(true);    // 「選択」状態にする。falseだと「選択解除」



では、サンプルプログラムを実行してみましょう。
イラスト付のボタンとイラスト無しのボタンが表示され、クリックすると、選択状態と選択解除状態に切り替わります。








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


SwingToggle2.java 直

/*
*JToggleButtonをグループ化する
*/

import javax.swing.*;

public class SwingToggle2 {

	private JToggleButton button1, button2;

	/**コンストラクタ*/
	public SwingToggle2() {

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

		//ボタンの生成
		button1 = new JToggleButton("Button1", icon);
		button2 = new JToggleButton("Button2",true);

		//ボタングループの生成
		ButtonGroup group = new ButtonGroup();

		//ボタングループにボタンを登録
		group.add(button1);
		group.add (button2);
	
	}

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

		SwingToggle2 toggle = new SwingToggle2();

		JFrame frame = new JFrame("Toggle2");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.getContentPane().add(toggle.button1, "West");
		frame.getContentPane().add(toggle.button2, "East");
		frame.pack();
		frame.setVisible(true);
	}
}



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


JToggleButtonは、それぞれについて「選択」「選択解除」になりますが、ポタングループに登録することで、グループ内のどれかひとつだけが選択可能(相互排他的な選択処理)になります。
ボタングループは、javax.swing.ButtonGroupを利用します。

JToggleButton button1 = new JToggleButton("ボタン1");
JToggleButton button2 = new JToggleButton("ボタン2", true);
ButtonGroup group = new ButtonGroup();
group.add(button1);
group.add(button2);



このとき、ボタングループに登録されたボタンがすべて「選択解除」状態なら、表示もそのようにされ、どれかのボタンが選ばれてから相互排他的な選択処理になります。
また、すべてのボタンが「選択」状態なら、一番先に「選択」状態に設定されたボタンのみが「選択」状態となります。


では、サンプルプログラムを実行してみましょう。
イラスト付のボタンとイラスト無しのボタンが表示され、クリックすると、選択状態と選択解除状態に切り替わります。
ただし、グループ化されているので両方とも選択状態には出来ません。








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


SwingToggle3.java 直

/**
*JToggleのイベント処理
*/

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

public class SwingToggle3 implements ItemListener {

	private JToggleButton button1, button2;
	private JFrame frame;

	/**コンストラクタ*/
	public SwingToggle3() {

		//フレームの生成
		frame = new JFrame("Toggle3");

		//ボタンの生成
		button1 = new JToggleButton("deselected");
		button2 = new JToggleButton("Selected",true);

		//イベントへの通知を登録
		button1.addItemListener(this);
		button2.addItemListener(this);

	}

	/**ボタンでイベントが発生した時の処理*/
	public void itemStateChanged(ItemEvent evt) {

		//ボタンの状態を取得
		int state = evt.getStateChange();

		String s;

		if(state == ItemEvent.SELECTED) {
			s="Selected";
		}
		else {
			s="Deselectes";
		}

		//押されたボタンを取得して、ボタンのテキストを変更
		Object obj = evt.getItem();
		if (obj.equals(button1)) {
			button1.setText(s);
		}
		else {
			button2.setText(s);
		}
		//フレーム以下のコンポーネントを再配置
		frame.validate();
		frame.pack();
	}
	/**main()*/
	public static void main(String[] args) {

		SwingToggle3 toggle = new SwingToggle3();

		toggle.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		toggle.frame.getContentPane().add(toggle.button1, "West");
		toggle.frame.getContentPane().add(toggle.button2, "East");
		toggle.frame.pack();
		toggle.frame.setVisible(true);
	}
}



JToggleButtonもJButtonと同様に、前回行ったjava.awt.event.ActionListenerを使用して、アクション・コマンドを取得する方法が使えます。


また、java.awt.event.*パッケージに含まれる、ItemListenerインタフェー・スとItemEventクラスを用いる方法もあります。
この場合、実装するメソッドは「itemStateChanged()」となります。
またその際、ItemEventから取得できる情報は「イベントソース(ItemSelectable)、イベントID(int)、アイテム(object)、変更された状態(int)」になります。
「変更された状態(int)」は「getStateChange()」メソッドで知ることができ、「ItemEvent.SELECTED」「ItemEvent.DESELECTED」であらわされるので、この状態を参照することでボタンの状態を確認することができます。

/**ボタンでイベントが発生したときの処理*/
public void itemStateChanged(ItemEvent evt) {
    // 押されたボタンの状態を取得
     int state = evt.getStateChange();

    if(state == ItemEvent.SELECTED) {
        System.out.println("選択");
    }
    else {
        System.out.println("選択解除");
    }
}



この他にも、押されたアイテム(この場合トグルボタン)を取得する「getItem()」メソッドなどがあります。


コンポーネント以下を再配置するにはvalidate()を使用します。

JFrame frame = new JFrame();
JLabel label = new JLabel("ラベル");
frame.getContentPane().add(label, "Center");
frame.validate();    // frameに配置されているコンポーネント(ラベル)を再配置



では、サンプルプログラムを実行してみましょう。
イラスト付のボタンとイラスト無しのボタンが表示され、クリックすると、選択状態(selected)と選択解除状態(deselected)に切り替わります。








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


SwingDraw2.java 直

/**
*JPanelにJCheckBoxとJRadioButtonを利用して図形を描画する
*/

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

public class SwingDraw2 extends JPanel implements ActionListener {

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

	private JPanel panel;
	private JLabel figLabel, paintLabel;
	private JCheckBox cbOval, cbRect;
	private JRadioButton rbDraw, rbFill;
	private JButton button;

	/**コンストラクタ*/
	public SwingDraw2() {

		//描画パネルの大きさを設定
		setPreferredSize(new Dimension(WIDTH, HEIGHT));

		//チェックボックス、ラジオボタンを置くパネルの生成
		panel = new JPanel();

		//チェックボックスの説明ラベルを生成
		figLabel = new JLabel("Zukei");

		//チェックボックスを生成
		cbOval = new JCheckBox("Oval", true);
		cbRect = new JCheckBox("Rect");
		cbRect.setSelected(true); //後で「選択」状態にする例

		//ラジオボタンの説明ラベルを生成
		paintLabel = new JLabel("Paint:");

		//ラジオボタンを生成
		rbDraw = new JRadioButton("Draw", false);
		rbFill = new JRadioButton("Fill", true);

		//ボタングループの生成
		ButtonGroup group = new ButtonGroup();

		//ラジオボタンをボタングループへ登録
		group.add(rbDraw);
		group.add(rbFill);

		//パネルにラベルと各種ボタンを貼り付け
		panel.add(figLabel);
		panel.add(cbOval);
		panel.add(cbRect);
		panel.add(paintLabel);
		panel.add(rbDraw);
		panel.add(rbFill);

		//ボタンの生成
		button = new JButton("Draw!!");

		//イベントの登録(ボタンのみ)
		button.addActionListener(this);
	}

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

		//コンポーネント全体を白で描画
		g.setColor(Color.white);
		g.fillRect(0,0,WIDTH, HEIGHT);

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

		//チェックボックスやラジオボタンの状態を調べて描画
		if(cbOval.isSelected() == true) {
			if(rbFill.isSelected() == true) {
				g.fillOval((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT-50)),50, 50);
			}
			else {
				g.drawOval((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT)),50,50);
			}
		}
		g.setColor(Color.green);

		//チェックボックスやラジオボタンの状態を調べて描画
		if(cbRect.isSelected() == true) {
			if (rbFill.isSelected() == true) {
				g.fillRect((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT-50)), 50, 50);
			}
			else {
				g.drawRect((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT-50)), 50, 50);
			}
		}
	}

	/**ボタンでイベントが発生した時の処理*/
	public void actionPerformed(ActionEvent evt) {

		//発生したイベント情報からアクション・コマンドを用いて、
		//「発生したコンポーネント」を調べて再描画
		//(ボタンしかイベント登録されてないので、無くても良い)
		String str = evt.getActionCommand();

		if(str.equals("Draw!!")) {
			repaint();
		}
	}

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

		SwingDraw2 draw = new SwingDraw2();

		JFrame frame = new JFrame("SwingDraw2");

		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.getContentPane().add(draw.panel, "North");
		frame.getContentPane().add(draw.button, "Center");
		frame.getContentPane().add(draw, "South");
		frame.pack();
		frame.setVisible(true);
	}
}



チェックボックスはJCheckBoxを使用します。
チェックボックスは、テキストを表示して「選択」「選択解除」状態を視覚的に示すのが一般的です。
JCheckBoxはJToggleButtonを親クラスとしていますので、その機能を使用することができます。
チェックボックスはグループで表示されることが多いですが、普通、相互排他的な処理はしません。

JCheckBox cb1 = new JCheckBox("チェック1");
ImageIcon icon = new ImageIcon("sample.gif");
JCheckBox cb2 = new JCheckBox(icon, true);
JCheckBox cb3 = new JCheckBox("チェック3", icon);



JCheckBoxも「setSelected()」を用いて、後で状態を変更することが可能です。
イベント処理も先に述べたようにJToggleButtonと同様に行えます。
また、AbstractButtonで定義されている、「isSelected()」メソッドを使用することで、「選択」「選択解除」状態を知ることもできます。


ラジオボタンはJRadioButtonを使用します。
ラジオボタンは通常、相互排他的な処理をしますので、ボタングループに登録する必要があります。
JRadioButtonもJToggleButtonを親クラスとしていますので、その機能を使用することができます。


【ラジオボタンの生成例】

JRadioButton rb1 = new JRadioButton("ラジオボタン1");
ImageIcon icon = new ImageIcon("sample.gif");
JRadioButton rb2 = new JRadioButton(icon, true);
JRadioButton rb3 = new JRadioButton("ラジオボタン3", icon);
ButtonGroup group = new ButtonGroup();
group.add(rb1);
group.add(rb2);
group.add(rb3);



JRadioButtonも「setSelected()」を用いて、後で状態を変更することが可能です。
また、イベント処理も先に述べたようにJToggleButtonと同様に行えます。
また、JCheckBoxと同様にAbstractButtonで定義されている、「isSelected()」メソッドを使用することで、「選択」「選択解除」状態を知ることもできます。


では、サンプルプログラムを実行してみましょう。
図形の形と色を塗りつぶすかどうかを選択して「Draw!」ボタンを押すとキャンバスにランダムな位置に選択した図形が表示されます。








<<前  [TOP]  次>>