ボタン


最も基本的なボタン

Swing におけるボタンは、javax.swing.AbstractButton クラスを継承します
このクラスは、ボタンの機能を宣言する抽象クラスです
何度も言うように、Swing はピアを呼び出さない完全な軽量コンポーネントをサポートし
これを実現するために、徹底した抽象化を行っているため、極めて柔軟な構造になっています

ボタンも同様で、開発者は AbstractButton クラスを継承したボタンを作り
利用者は実体を気にすることなく AbstractButton クラスの機能を利用すれば
非常にオブジェクト指向的な、柔軟で効率的な開発を実現することができます
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.AbstractButton

public abstract class AbstractButton extends JComponent
	implements ItemSelectable, SwingConstants
ボタンに必要な多くの機能は、このクラスに実装されています
このクラスを実装した、最も基本的なボタンが javax.swing.JButton クラスです
JButton は、AbstractButton クラスからの変更はほとんどありません
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.AbstractButton
                          |
                          +--javax.swing.JButton

public class JButton extends AbstractButton implements Accessible
このクラスのコンストラクタには、次のようなものがあります

public JButton()
public JButton(Icon icon)
public JButton(String text)
public JButton(Action a)
public JButton(String text , Icon icon)

icon にはボタンに表示するアイコンを、text には表示するテキストを指定します
a にはプロパティを格納したアクションを指定します

アクションは、この場では語りきれないほど重要なトピックなので
詳細については後ほど解説いたします

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

public class Test extends JApplet {
	public void init() {
		Icon icon = new ImageIcon("icon.jpg");
		JButton button1 = new JButton("Kitty on your lap" , icon);
		JButton button2 = new JButton("Tokyo mew mew");

		getContentPane().setLayout(new GridLayout(2 , 1));
		getContentPane().add(button1);
		getContentPane().add(button2);
	}
}


このプログラムは、二つのボタンを作成してそれを表示しています
一方はアイコンをつけたボタンで、もうひとつは単純なテキストのみのボタンです

ところで、このボタンは多くのユーザーにとって見慣れないものでしょう
それどころか、これから紹介する Swing コンポーネントの全ては
そのシステムがサポートしているコンポーネントとは異なったものに違いありません

これは Metal と呼ばれるルックアンドフィールであり、システムのものではありません
詳しくはルックアンドフィールについて解説する時に紹介しますが
こうした、独自のルックアンドフィールを実現できるのは Swing の特徴であり
システムの API ではなく、Java の軽量コンポーネントで作成しているからこそなのです

AbstractButton はその性質上、JLabel と直接の関係はありませんが
同一の名前で同一の機能を持つメソッドがいくつも存在します

アイコンは AbstractButton.setIcon() メソッドで設定し
AbstractButton.getIcon() メソッドを用いて取得することができます

public void setIcon(Icon icon)
public Icon getIcon()

icon には、新しく設定するアイコンを指定します
テキストを設定するには AbstractButton.setText()
取得するには AbstractButton.getText() メソッドを用います

public void setText(String text)
public String getText()

text には、表示する新しいテキストを指定します

ラベルの内容の X 軸の位置は AbstractButton.HorizontalAlignment()
Y 軸の位置は AbstractButton.setVerticalAlignment() メソッドを使います
ラベル同様に、これらの情報を取得する get〜() メソッドも存在します

public void setHorizontalAlignment(int alignment)
public void setVerticalAlignment(int alignment)
public int getHorizontalAlignment()
public int getVerticalAlignment()

alignment には、位置情報を示す SwingConstants の定数を指定します
X 軸に対しては、LEFT、CENTER、RIGHT、LEADING、または TRAILING のうちの 1 つ
Y 軸に対しては、TOP、CENTER、または BOTTOM のうちの 1 を指定することができます

これらのメソッドは、JLabel でも存在するメソッドであり
提供する機能は基本的に同じなので、同一の名前を持っているのです
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		Icon icon = new ImageIcon("icon.jpg");
		JButton button = new JButton("Kitty on your lap" , icon);
		button.setHorizontalAlignment(SwingConstants.RIGHT);
		button.setVerticalAlignment(SwingConstants.TOP);

		getContentPane().add(button);
	}
}


このプログラムは、ボタンの内容を右上に配置したものです


イベント処理

ボタンのイベントを処理するには、やはりリスナを登録します
Swing のボタンも、AWT 同様に ActionListener を使ってボタンのクリックを処理できます
リスナを登録するには AbstractButton.addActionListener() メソッドを
解除するには AbstractButton.removeActionListener() メソッドを使います

public void addActionListener(ActionListener l)
public void removeActionListener(ActionListener l)

リスナを登録すれば、ボタンがクリックされたときに呼び出されます
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JApplet implements ActionListener {
	public void init() {
		JButton button = new JButton("Kitty on your lap");
		button.addActionListener(this);

		getContentPane().add(button);
	}

	public void actionPerformed(ActionEvent e) {
		System.out.println("OnButton - " + e.getSource());
	}
}
このプログラムは、ボタンを押すと
標準出力に、イベントを発生させたオブジェクトの情報を表示します


状態とアイコン

AbstractButton クラスは、状態とアイコンの関連付けも行っています
ボタンは、有効/無効状態以外にも、押されている状態、選択されている状態
マウスがボタンの上にあるロールオーバー状態などが存在します

無効状態アイコンの設定は JLabel と同名のメソッドが用意されています
無効状態のアイコンを設定するには AbstractButton.setDisabledIcon()
無効状態のアイコンを得るには AbstractButton.getDisabledIcon() を用います

public void setDisabledIcon(Icon disabledIcon)
public Icon getDisabledIcon()

disabledIcon には無効状態に表示するアイコンを指定します
押された状態のアイコンは AbstractButton.setPressedIcon() で設定し
AbstractButton.getPressedIcon() メソッドで取得することができます
ロールオーバーのアイコンは AbstractButton.setRolloverIcon() で設定し
AbstractButton.getRolloverIcon() で取得できます

public void setPressedIcon(Icon pressedIcon)
public Icon getPressedIcon()
public void setRolloverIcon(Icon rolloverIcon)
public Icon getRolloverIcon()

pressedIcon には、押した状態に表示されるアイコンを
rolloverIcon には、オールオーバー時に表示されるアイコンを指定します
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		JButton button = new JButton("Kitty on your lap");
		button.setIcon(new ImageIcon("icon1.jpg"));
		button.setDisabledIcon(new ImageIcon("icon2.jpg"));
		button.setRolloverIcon(new ImageIcon("icon3.jpg"));
		button.setPressedIcon(new ImageIcon("icon4.jpg"));

		getContentPane().add(button);
	}
}
このプログラムは、各状態に応じてアイコンが変化するボタンを作成しています
ただし、この状態ではボタンが無効状態に移行することはありません



前のページへ戻る次のページへ