こんにちは。
今回はSwingのボタンを扱います。
SwingにはJButtonクラスというボタンを扱うクラスがあります。今回の学習ではフレームにJButtonオブジェクトを追加することを試しました。この記事では基本的な使い方を紹介します。
以下のプログラムを雛形として使います。
ソース
import javax.swing.JFrame;
public class Test extends JFrame {
public static void main(String[] args) {
new Test();
}
public Test() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 250);
init();
setVisible(true);
}
private void init() {
// 設置処理
}
}
テキスト付きのボタン
コンストラクタはいくつかあるのですが、ここではJButton(String text)を使います。
配置
以下は2つのボタンを生成して配置している例です。
ソース
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Test2 extends JFrame {
public static void main(String[] args) {
new Test2();
}
public Test2() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 250);
init();
setVisible(true);
}
private void init() {
setLayout(new FlowLayout());
JButton button1 = new JButton("test1");
add(button1);
JButton button2 = new JButton("test2");
add(button2);
}
}

JFrameのLayoutManagerの初期設定がBorderLayoutのため、FlowLayoutを指定してしています。BorderLayoutの場合、最初に配置したボタンが全体に広がってしまいます。コンストラクタJButton(String text)の引数はボタンに表示される文字列です。生成したボタンオブジェクトはadd(Component comp)メソッドで追加することができます。
活性・非活性
以下は設置した最初のボタンを活性、次のボタンを非活性にする例です。(init()メソッドの最後に追加する部分。)
ソース
button1.setEnabled(true);
button2.setEnabled(false);

AbstractButtonクラスから継承されたメソッドにpublic void setEnabled(boolean b)があります。このメソッドでボタンの活性・非活性を設定することができます。引数には、ボタンを有効にする場合はtrue、そうでない場合はfalseを指定します。
ボタン押下時の動作
以下の例ではボタンの押下時の動作を設定しています。初期状態では、最初のボタンを活性、次のボタンを非活性です。最初のボタンが押下されたときの動作に、「次のボタンを活性させる」という処理を記述しています。
ソース
button1.setEnabled(true);
button2.setEnabled(false);
button1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
button2.setEnabled(true);
}
});
Componentクラスから継承されたメソッドにpublic void addMouseListener(MouseListener l)があります。マウス・イベントを受け取るために、このメソッド引数に指定することで、マウス・リスナーを追加することができます。MouseListenerの実装クラスにMouseAdapterクラスがあります。このクラスはメソッドの実装が空で定義されています。ボタン押下時の動作を定義するにはmouseClickedメソッドをオーバライドします。
アイコン付きのボタン
コンストラクタJButton(Icon icon)を使うとアイコン付きボタンを作ることができます。
ソース
import java.awt.FlowLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Test5 extends JFrame {
public static void main(String[] args) {
new Test5();
}
public Test5() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 250);
init();
setVisible(true);
}
private void init() {
setLayout(new FlowLayout());
Icon icon = new ImageIcon("icon/sample.png");
JButton button1 = new JButton(icon);
add(button1);
JButton button2 = new JButton(icon);
add(button2);
button1.setEnabled(true);
button2.setEnabled(false);
}
}

非活性の場合は画像はグレースケールになるようです。
テキストおよびアイコン付きのボタン
コンストラクタJButton(String text, Icon icon)を使うとテキストとアイコン付きのボタンを作ることができます。
ソース
setLayout(new FlowLayout());
Icon icon = new ImageIcon("icon/sample.png");
JButton button1 = new JButton("test1", icon);
add(button1);
JButton button2 = new JButton("test2", icon);
add(button2);
button1.setEnabled(true);
button2.setEnabled(false);

API仕様書によると、文字列とアイコンの位置は以下のメソッドで調節できるようです。
- public void setVerticalTextPosition(int textPosition)
- public void setHorizontalTextPosition(int textPosition)
以上、参考になれば幸いです。