こんにちは。
今回の記事では、Swingに用意されているJListとJComboBoxを扱ってみました。
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型の配列を使った例です。
ソース
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JList;
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());
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>で選択された項目です。何も選択されていない場合は空のリストが返却されます。
次のサンプルプログラムでは、ボタンが押下されたとき、コンソールに選択された項目を出力します。
ソース
import java.awt.FlowLayout;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
public class Test3 extends JFrame {
public static void main(String[] args) {
new Test3();
}
public Test3() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 250);
init();
setVisible(true);
}
private void init() {
setLayout(new FlowLayout());
String[] data1 = { "item01", "item02", "item101", "item102" };
JList<String> list1 = new JList<>(data1);
add(list1);
JButton button = new JButton("GET");
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)のみ定義されています。このメソッドはリストの選択範囲内の値が変更されたときに呼び出されます。
次のソースでは選択項目が変更されるたびにコンソールに選択されている項目を出力するという処理を定義しています。
ソース
import java.awt.FlowLayout;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JList;
public class Test4 extends JFrame {
public static void main(String[] args) {
new Test4();
}
public Test4() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 250);
init();
setVisible(true);
}
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)
JComboBoxにも、JLabelと同じように引数がE[] itemsであるコンストラクタが用意されています。以下はString配列を使った例です。
ソース
import java.awt.FlowLayout;
import javax.swing.JComboBox;
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());
String[] data = { "item01", "item02", "item101", "item102" };
JComboBox<String> comboBox = new JComboBox<>(data);
add(comboBox);
}
}
以下は初期表示です。
以下はJComboBoxをクリックしたときの表示です。
このコンストラクタはnew DefaultComboBoxModel<E>(items)でコンボボックスのデフォルト・モデルを生成し、setModel()メソッドの引数にしています。
選択されている項目を取得
選択されている項目を取得するメソッドとしてint getSelectedIndex()メソッドがあります。現在選択されているリスト項目を指定する整数値が返却されます。最初の項目は0です。
以下はボタンを押すとコンソールに選択された項目を指定する整数を表示する例です。
ソース
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class Test6 extends JFrame {
public static void main(String[] args) {
new Test6();
}
public Test6() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 250);
init();
setVisible(true);
}
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の実装クラスを指定することで、項目が選択されたときに実行される処理を記述することができます。
以下では項目が選択された場合に、コンソールに「Selected.」と表示する例です。
ソース
import java.awt.FlowLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class Test7 extends JFrame {
public static void main(String[] args) {
new Test7();
}
public Test7() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 250);
init();
setVisible(true);
}
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("Selected.");
});
}
}
なお、項目の選択は、クリックの他にも十字キーの操作でも可能です。十字キーを使った場合も、「Selected.」が出力されます。
以上、参考になれば幸いです。