2.Button系のコンポーネント

ボタンも拡張されてます。さらに詳しい内容は API ドキュメントを参考にしてください。

(1) Button 系クラスの概要

 今までの AWT ではボタンといえば kava.awt.Button のみでした。Swing ではボタンのように「押す」という動作をするコンポーネントのスーパークラスとして javax.swing.AbstractButton というクラスが導入されました。AbstractButton はボタンの基本的な機能を定義しています。

 この AbstractButton のサブクラスとして、JButton、JToggleButton、JMenuItem の3つのクラスがありますが、今回は JButton、JToggleButton の2つを紹介します。

 JToogleButton は Swing で新しく登場したクラスです。JToggleButton は一昔前のラジカセのボタンのように、1回押すと「ON」の状態、もう1回押すと「OFF」の状態になるボタンです。JButton は AWT のときと同じ使い方だと思ってかまいません。

 JButton、JToggleButton ともにボタンを押した時に ActionEvent が発生します。ですからイベント処理の場合は Button の時と同じように Actionlistener を登録しておくことで処理することができます。

(2) アイコン付きボタン

 これらのボタン系のクラスは、アイコン付きのボタンが簡単に作れます。アイコンを作るには javax.swing.Icon インタフェースと javax.swing.ImageIcon クラスを使い、次のように作ります。

Icon icon = new ImageIcon("icon.gif");

JButton icon_button = new JButton("アイコンボタン",icon);

JButton icon_button2 = new JButton("アイコンボタン2");
icon_button2.setIcon(icon);

 コンストラクタを使ってアイコンを設定しても良いですし、AbstractButton クラスの setIcon を使ってアイコンを設定してもかまいません。コンストラクタに文字列だけ渡してやれば、文字だけのボタンもできます。

  ButtonSample.java

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

class ButtonSample extends JFrame implements ActionListener {

    ButtonSample() {
        super("ButtonSample");

        /* 画像ファイルは適当に用意してください */
        Icon icon = new ImageIcon("tama1-b.gif");

        /* アイコン付きボタン */
        JButton icon_button = new JButton("アイコンボタン",icon);
        icon_button.addActionListener(this);

        /* アイコン付きトグルボタン */
        JToggleButton icon_button2 = new JToggleButton("OFF");
        icon_button2.setIcon(icon);
        icon_button2.addActionListener(this);

        setSize(200,200);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        c.add(icon_button);
        c.add(icon_button2);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();
        if ( src instanceof JButton ) {
            System.out.println("JButton: クリック!");
        }
        if ( src instanceof JToggleButton ) {
            JToggleButton b = (JToggleButton)src;
            /* ボタンの状態によってラベルを変更 */
            if ( b.isSelected() ) {
                b.setText("ON");
            } else {
                b.setText("OFF");
            }
        }
    }

    public static void main(String args[]) {
        new ButtonSample();
    }

}


 実行例

C:\java_test>javac ButtonSample.java

C:\java_test>java ButtonSample


 実行結果



(3) 細かい設定がしたい

 Swing で共通に使う定数として javax.Swing.SwingConstants インタフェースに定義されている定数があります。この定数を使ってボタンの見栄えの制御をさらに細かく行うことができます。AbstractButton クラスにはボタンのラベルの位置を設定するメソッドがあります。

setHorizontalAlignment(int alignment);
setVerticalAlignment(int alignment);
setHorizontalTextPosition(int textPosition);
setVerticalTextPosition(int textPosition);

 これらのメソッドを使ってアイコンやラベルの位置を調節します。SwingConstants にどんな値があるかはAPIドキュメントの javax.swing.SwingContants を参考にしてください。AbstractButton のところにも設定できる値が書いてあります。SwingConstans はこの後もよく出てきます。

 また Swing コンポーネントのスーパークラスとして JComponent クラスがあり、JComponent のスーパークラスとして Component クラスがあります。ですから GUI コンポーネント全体に共通する設定(背景色など)は、これらのクラスのメソッドを使って行います。

  ButtonSample2.java

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

class ButtonSample2 extends JFrame {

    ButtonSample2() {
        super("ButtonSample2");
        Icon icon = new ImageIcon("tama1-b.gif");

        /* アイコン付きボタン */
        JButton button = new JButton("アイコンボタン",icon);
        button.setHorizontalTextPosition(SwingConstants.LEFT);
        button.setVerticalTextPosition(SwingConstants.bottom);
        button.setBackground(new Color(255,192,96));

        setSize(200,200);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        c.add(button);
        setVisible(true);
    }

    public static void main(String args[]) {
        new ButtonSample2();
    }

}


 実行例

C:\java_test>javac ButtonSample2.java

C:\java_test>java ButtonSample2


実行結果


前の章(1.Swing 〜コンテナの使い方)   次の章(3.JLabel/JCheckBox/JRadioButton)