torutkのブログ

ソフトウェア・エンジニアのブログ

JComboBoxとenum型は相性がよい

JComboBoxは比較的少数の選択肢から1つを選ぶときに活躍する割と使い出のあるGUI部品ですが、プログラミングは少々面倒なところがあります。JTreeやJListのように本格的なデータ構造を扱うときは、本腰を入れてデータ側を作りますが、JComboBoxは軽いデータ構造なので、ComboBoxModelインタフェースの実装クラスを作るような手間はかけたくないという思いがあります。しかし、配列でお茶を濁そうとすると、GUIプログラミングが煩雑になります。

そんなときに、enum型を使うと意外と簡潔かつ型安全にいけます。

まず簡単な例として、ボーレート値を複数持つenum型を定義します。

public enum Baudrate {
    BAUD_1200, BAUD_2400, BAUD_4800, BAUD_9600, BAUD_14400, BAUD_28800,
    BAUD_38400, BAUD_57600, BAUD_115200;
}

enum型で定義した要素を選択肢とするJComboBoxを生成します。

        baudrateComboBox = new JComboBox(
            new DefaultComboBoxModel(Baudrate.values())
        );

通常、DefaultConboBoxModelコンストラクタの引数に配列かVector型で渡すのですが、enum型を定義すると自動的にvaluesメソッドが生成されるので、これを利用しています。GUIプログラムで配列やVectorを別途定義しなくてもいいので楽になります。

選択肢の表示は、enum型で定義した名称そのままなので、かなりいい具合です。

JComboBoxで選択した項目を取得するのも簡単です。

        Baudrate rate = (Baudrate)baudrateComboBox.getSelectedItem();
        setBaudrate(rate);

JComboBoxは項目が選択されるとactionListenerを呼びます。その中で、どの項目が選択されたかをgetSelectedItemメソッドで取得します。これは戻り値がObject型なのでキャストしています。

以下に全コードを示します。

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class BaudrateView extends JFrame {
    public BaudrateView() {
        baudrateComboBox = new JComboBox(
            new DefaultComboBoxModel(Baudrate.values())
        );
        baudrateComboBox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent anEvent) {
                    setBaudrate((Baudrate)baudrateComboBox.getSelectedItem());
                }
            }
        );
        setLayout(new FlowLayout());
        add(baudrateComboBox);
    }

    public void setBaudrate(Baudrate aBaudrate) {
        // ボーレート設定処理
    }

    public static final void main(final String... args) {
        SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame app = new BaudrateView();
                    app.setBounds(400, 400, 320, 200);
                    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    app.setVisible(true);
                }
            }
        );
    }

    private JComboBox baudrateComboBox;
}