こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

SwingのJList、JComboBox

こんにちは。「Javaを復習する初心者」です。SwingでJList、JComboBoxを扱ってみました。

JList、JComboBoxともに項目の一覧を表示して、ユーザに選択してもらうコンポーネントです。JListでは内容がすべて表示され、JComboBoxでは選択した項目のみが表示されます。

以下のプログラムを雛形として使います。

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() {
        // 設置処理
    }

}

JList

コンストラクタJList(E[] listData)

JListクラスはAbstractListModel<E>インターフェースの実装クラスを扱うクラスのようですが、コンストラクタJList(E[] listData)を使うと、AbstractListModelを意識することなく使うことができるようです。JList(E[] listData)は内部的にはAbstractListModelの匿名クラスを生成して、コンストラクタJList(ListModel<E> dataModel)に渡しています。

ジェネリックスEに指定する一番簡単な例はString型だと思います。ここで注意することはジェネリックスに指定したクラスに対して、toString()メソッドの値が表示されるということです。

以下の例ではString型の配列、Double型の配列を使った例です。

    private void init() {
        // 設置処理
        setLayout(new FlowLayout());

        String[] data1 = { "item01", "item02", "item101", "item102" };
        JList<String> list1 = new JList<>(data1);
        add(list1);

        Double[] data2 = { 0.1, 0.2 };
        JList<Double> list2 = new JList<>(data2);
        add(list2);
    }

Double型配列を使ったリストでは要素に対してtoString()メソッドが実行されているため、小数点付きの文字列が表示されるということです。

先ほども記載しましたが、コンストラクタJList(E[] listData)では、コンストラクタJList(ListModel<E> dataModel)を呼び出しています。引数に指定した配列からAbstractListModel<E>を実装した匿名クラスを生成しています。そのため、上記ソースのようにAbstractListModel<E>インターフェースを意識することなくプログラミングができます。

選択されている項目を取得

API仕様書を見ると、選択されている項目を取得するメソッドがいくつか用意されているのが分かります。ここではgetSelectedValuesListメソッドを紹介します。このメソッドの戻り値はList<E>で選択された項目を返却します。何も選択されていない場合は空のリストが返却されます。

次のソースではボタンが押された場合、コンソールに選択された項目を出力する例です。

    private void init() {
        // 設置処理
        setLayout(new FlowLayout());

        String[] data1 = { "item01", "item02", "item101", "item102" };
        JList<String> list1 = new JList<>(data1);
        add(list1);

        JButton button = new JButton("取得");
        add(button);
        button.addActionListener(event -> {
            List<String> items = list1.getSelectedValuesList();
            for (String s : items) {
                System.out.println(s);
            }
        });
    }

上記プログラムではJListの宣言で、JList<String>と宣言しています。そのため、getSelectedValuesList()メソッドの返却値はList<String>になります。

ListSelectionListener

選択項目が変更されたときに実行したい処理がある場合は、addListSelectionListener()メソッドを使って、リスナーを追加する方法があります。引数にしていするクラスはListSelectionListenerインターフェースの実装クラスです。このインターフェースにはvalueChanged(ListSelectionEvent e)のみ定義されています。このメソッドはリストの選択範囲内の値が変更されたときに呼び出されます。

次のソースでは選択項目が変更されるたびにコンソールに選択されている項目を出力するという処理を定義しています。

    private void init() {
        // 設置処理
        setLayout(new FlowLayout());

        String[] data1 = { "item01", "item02", "item101", "item102" };
        JList<String> list1 = new JList<>(data1);
        add(list1);

        list1.addListSelectionListener(event -> {
            List<String> items = list1.getSelectedValuesList();
            for (String s : items) {
                System.out.println(s);
            }
        });
    }

上記の動きを実際に確認したのですが、マウス操作ではクリックのたびに2回呼び出されてしまいました。他に適切な方法があるのかもしれません。

JComboBox

コンストラクタJComboBox(E[] items)

JLabelと同じように引数がE[] itemsであるコンストラクタが用意されています。以下はString配列を使った例です。

    private void init() {
        // 設置処理
        setLayout(new FlowLayout());

        String[] data = { "item01", "item02", "item101", "item102" };
        JComboBox<String> comboBox = new JComboBox<>(data);
        add(comboBox);
    }

以下は初期表示です。

以下はJComboBoxをクリックしたときの表示です。

このコンストラクタはnew DefaultComboBoxModel<E>(items)でコンボボックスのデフォルト・モデルを生成し、setModel()メソッドの引数にしています。

選択されている項目を取得

選択されている項目を取得するメソッドとしてint getSelectedIndex()メソッドがあります。現在選択されているリスト項目を指定する整数値が返却されます。最初の項目は0です。

以下はボタンを押すとコンソールに選択された項目を指定する整数を表示する例です。

    private void init() {
        // 設置処理
        setLayout(new FlowLayout());

        String[] data = { "item01", "item02", "item101", "item102" };
        JComboBox<String> comboBox = new JComboBox<>(data);
        add(comboBox);

        JButton button = new JButton("取得");
        add(button);
        button.addActionListener(event -> {
            int index = comboBox.getSelectedIndex();
            System.out.println(index);
        });
    }

“item01″を選択している場合、0、”item02″を選択している場合、1が表示されます。

ActionListener

addActionListener()メソッドが用意されています。引数にActionListenerの実装クラスを指定することで、項目が選択されたときに実行される処理を記述することができます。

以下では項目が選択された場合に、コンソールに「選択されました。」と表示する例です。

    private void init() {
        // 設置処理
        setLayout(new FlowLayout());

        String[] data = { "item01", "item02", "item101", "item102" };
        JComboBox<String> comboBox = new JComboBox<>(data);
        add(comboBox);

        comboBox.addActionListener(event -> {
            System.out.println("選択されました。");
        });
    }

「項目が選択されたときに」なのですが、クリックの他にも十字キーで項目の選択を変更したときも呼び出されます。