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

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

Javaプログラミング入門その38 JButtonとJLabelを利用したプログラム

<<前  [TOP]  次>>


JLabeは画像やテキストの表示を行い、JButtonは画像やテキストの表示を行った上で、そのオブジェクトに対するイベントを取得することが可能です。
JLabelとJButtonは同様の機能を持った同名のメソッドが多数ありますが、下記の通りクラスの継承関係は異なります。


【JLabel,JButtonのクラス階層】

java.lang.Object
    |
    +--java.awt.C?ponent
        |
        +--java.awt.Container
            l
            +--javax.swing.JComponent
                l
                +--javax.swing.AbstractButton
                |    |
                |    +--javax.swing.JButton
                |    +--javax.swng.JMenuItem
                |    +--javax.swing.JToggleButton
                +--javax.swing.JLabel



JButtonはAbstractButtonを継承し、JLabelと同名のメソッドの多くはAbstractButtonで定義されています。
AbstractButtonはボタンやメニュー項目の共通動作を定義しており、直系のクラスにはJButtonの他、JMenultem(メニュー関係)とJToggleButton(チェックボックスなどの親クラス)があります。


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


SwingButtonLabel1.java 直

import javax.swing.*;

public class SwingButtonLabel1 {

	private JButton button;
	private JLabel label1, label2;
	private ImageIcon[] icons;

	public SwingButtonLabel1() {

		//イメージの生成
		icons = new ImageIcon[2];
		icons[0] = new ImageIcon("char0.gif");
		icons[1] = new ImageIcon("char6.gif");

		//ボタンの生成
		button = new JButton("Button", icons[0]);

		//ラベルの生成
		label1 = new JLabel("Label1", icons[1], SwingConstants.CENTER);

		//ラベルの生成(HTML)
		String text = "<html><front size=7 color=red>Label2</front><img src=\"file:./char6.gif\"></html>";
			label2 = new JLabel(text);
	}

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

		SwingButtonLabel1 sample = new SwingButtonLabel1();

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

		//[閉じる]ボタンが押された場合はフレームを閉じる
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

		//コンテンツ・ペインにJButton,JLabelを配置
		frame.getContentPane().add(sample.button,"Center");
		frame.getContentPane().add(sample.label1, "West");
		frame.getContentPane().add(sample.label2, "East");
		frame.pack();
		frame.setVisible(true);
	}
}



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


Swingコンポーネントで画像を扱う場合はlmagelcon(javax.swing.ImageIcon)を用います。
ImageIconはファイルやURLなどで示されたイメージ(gif,png,jpg)からアイコンを描画します。

//ファイルからの生成例。imagesディレクトリ以下にあるmyimage.gifから生成
ImageIcon icon = new ImageIcon("images/myimage.gif");



JLabelの主な生成方法は以下のとおりです。
画像とテキストの両方を表示する場合には、どの位置にするかを指定しなければいけません。

JLabe label1 = new JLabel("これはラベルです");
Imagelcon icon = new ImageIcon("sample.glf");
JLabel label2 = new JLabel(icon);
Jlabel label3 = new JLabel("これはラベルです", icon, SwingConstants.CENTER);



位置の指定法については、javax.swingのインタフェースSwingConstantsを参照して下さい。
ただし、ラベルの大きさを指定せず最適な大きさで表示させる場合は、見た目でわかるような変化はありません。
ラベルのイメージを(再)設定するには、setIcon(ImageIcon)メソッドを使用します。
またテキストなら、setText(String)メソッドを使用します。

//JLabel label1, label2とImageIcon iconが生成済みの場合の再設定
label1.setIcon(icon);
label2.setText(,"ラベルの文字列を再設定");



JButtonもJLabelと同様な指定方法で使用することができますが、先に述べたとおり、実際には親クラスであるAbstractButtonで定義されているメソッドを利用しています。
一部の生成例をあげておきます。
JButtonの場合、画像とテキストの両方で生成する際の位置指定は必要ありません。
生成後に指定することは可能です。

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



ボタンのイメージやテキストの(再)設定についても、JLabelと同様にsetlcon()
メソッドとsetText()メソッドで行えます。

//JButton button1, button2とImageIcon iconが生成済みの場合の再設定
button1.setIcon(icon);
button2.setText(`ボタンの文字列を再設定");



JLabelやJButtonで表示するテキストをHTML形式にすることで、それに沿った表示が行われます。

JLabel label = new JLabel("<html><font color=red>赤ラベルく/font></html>");



JLabelやJButtonではそこに表示するアイコンや文字列の配置場所を指定することが可能です。
場所を指定するには、setVerticalAlignment(垂直方向配置指定)、あるいはsetHorizontalAlignment(水平方向配置指定)を用います。
垂直方向の指定は、javax.swingのインタフェースSwingConstantsにある「TOP」「CENTER(デフォルト)」「BOTTOM」で、水平方向の指定はrLEFT」「CENTER(イメージのみのラベルのデフォルト〉」「RIGHT(ボタンのデフォルト〉」「LEADING(テキストのみのラベルのデフォルト)」「TRAILING」です。


また、アイコンとテキストを同時に表示している場合、アイコンに対する文字列の位置指定は、setVerticalTextPosition(垂直方向配置指定)、setHorizontalTextPosition(水平方向配置指定)で行えます。
指定の値は先のset○○Alignment()と同様です。

//文字列をアイコンの下に表示
JLabel label = new JLabel("ラベル", icon, SwingConstants.CENTER);
label.setHorizontalTextPosition(SwingConstants.CENTER);
label.setVerticalTextPosition(SwingConstants.BOTTOM);



では、サンプルプログラムを実行してみましょう。
両サイドにラベル、真ん中にボタンが表示されます。
ラベルとボタンにはそれぞれ画像が表示されます。








もう一つ、サンプルプログラムを作成してみましょう。


SwingButtonEvent1.java 直

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

public class SwingButtonEvent1 implements ActionListener {

	private JButton button;
	private JLabel label;
	private ImageIcon[] icons;
	private int iconNo;
	private int Step;

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

		iconNo = 0;
		Step = 1;

		//イメージの生成
		icons = new ImageIcon[2];
		icons[0] = new ImageIcon("char0.gif");
		icons[1] = new ImageIcon("char6.gif");

		//ボタンの生成
		button = new JButton("Button", icons[0]);

		//ラベルの生成
		label = new JLabel("Label", icons[1], SwingConstants.CENTER);

		//ボタンのイベントを通知
		button.addActionListener(this);
	}

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

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

		if (str.equals("Button")) {

			//icons配列の添字を、符号の反転によって「0」←→「1」
			iconNo += Step;
			button.setIcon(icons[iconNo]);
			Step*=-1;
		}
	}

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

		SwingButtonEvent1 sample = new SwingButtonEvent1();

		JFrame frame = new JFrame("ButtonEvent1");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.getContentPane().add(sample.button, "West");
		frame.getContentPane().add(sample.label, "East");
		frame.pack();
		frame.setVisible(true);
	}
}



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


Swingのイベント処理は、「MVC」という考え方をもとにしています。

M-モデル--データを保持し、データにアクセスする手段の提供
V-ビュ--モデルのデータ(一部あるいは全部)を視覚的に表現
C-コントロール--イベント処理

MVCにより、1つのモデルに対して、複数のビューやコントロールをすることが可能となります。



実際のイベント処理の記述方法はAWTと同様に行うことができます。
例えば以下のようになります。

  1. イベントリスナーをimplementsする。
  2. イベントの発行をしたいコンポーネントにaddActionListenerなどのように、イベントリスナーをadd○○と贅録する。
  3. リスナーのメソッド(actionListenerならactionPerfomed()メソッド)にイベント処理を記述する。

//ActionEventが起こった場合の処理
public class Sample implements ActionListener {
    //JButton buttonにActlonListenerを登録
     button.addActionListener(this);

    /** ボタンでイベントが発生したときの処理 */
    public void actionPerformed(ActionEvent evt) {
        処理を記述
     }
} 

さらにSwing独自のイベントリスナーもあります。
例えばChageListenerはSwingコンポーネントの情報が変わったときに発生するイベント(ChageEvent)が発生した場合にstateChange()メソッドに処理を定義することが可能です。


JButtonでイベントを処理する場合は、java.awt.event.ActionListenerを使用します。
具体的な処理はActionPerformed()メソッドに記述します。
押されたオブジェクトの情報はアクション・コマンドを取得する(getActionCommand()メソッド)などとして取得します。
アクション・コマンドの設定は、オブジエクト生成時にテキストを指定したのなら、その値になります。
表示テキストと違う値にする場合にはsetActionCo?and(String)メソッドで文字列を指定しておけばよいです。
アクション・コマンドの機能は、JButton固有ではなく、親クラスであるAbstractButtonで定義されています。

//テキストを持ったボタンを生成。アクション・コマンドの文字列も「ボタン」
JButton button = new JButton("ボタン");

//アクション・コマンドの文字列を「実行」に変更
//表示テキストは「ボタン」のまま
button.setActionCo?and("実行");

/**ボタンでイベントが発生したときの処理*/
public void actionPerformed(ActionEvent evt) {
    //イベント情報から「発生したコンポーネント」を
    //アクションコマンドを利用して調べる
    String str = evt.getActionCo?andO;

    if(str.equals("実行")) {
        処理記述
     }
}



では、サンプルプログラムを実行してみましょう。
右側にラベルが表示され、左側にボタンが配置されます。
ボタンを押すとボタンの背景画像が変わります。








<<前  [TOP]  次>>