リストという言葉から連想できるのは名簿だとかカタログみたいな資料ですが、 GUI部品としてのリストこれです。
コンストラクター
コンストラクタ | 引数 | 説明 |
---|---|---|
JList() | なし | JListを生成(選択項目なし) |
JList(Object [ ] listData) | オブジェクト配列 | 引数の配列要素を選択項目として登録したJListを生成 |
JList(ListModel dataMode) | リスト管理モデル | リスト管理モデルを利用したJListを生成 |
メソッド
メソッド | 返却値 | 引数 | 説明 |
---|---|---|---|
setSelectedIndex(int index) | void | 項目番号 | 引数の番号の項目を選択する |
getSelectedIndex( ) | int | なし | 選択されている項目の項目番号を取得 |
isSelectedIndex(int index) | boolean | 項目番号 | 引数で指定した番号の項目が選択されているか判定する |
setSelectedIndex(int [ ] index) | void | 項目番号リスト | 配列内の項目番号すべて選択する |
setSelectedValue(Object values, boolean state) | void | 項目値、状態 | 指定した項目の選択状態を変更 |
getSelectedValue() | Object | なし | 選択された項目の値を取得 |
配列を利用して選択項目設定するということは項目が固定されてしまっている。
これでは追加・変更・削除などデータ項目に対する基本的な操作が仕様上不可能なプログラムになる(変更自体は見かけ上はできる)
■DefaultListModel
JListクラス選択項目編集する目的で提供するクラスです。イメージとしては動的配列が近いです。
メソッド
操作 | メソッド | 返却値 | 引数 | 説明 |
---|---|---|---|---|
追加 | add(int index , Object values) | なし | 項目番号、項目値 | 引数で指定した位置に項目を追加 |
追加 | addElement(Object) | なし | 項目値 | リストの最後に項目を追加 |
削除 | remove(int index) | なし | 項目番号 | 引数の項目番号の項目を削除 |
削除 | removeElement(Object values) | なし | 項目値 | 項目値を削除 |
JList自身の取得用メソッドがあるため とくに必要はない。
ちなみにコンストラクタはデフォルトコンストラクタのみなので使用方法を意識しなくても良いです。
■サンプルプログラム
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
public class GuiJList extends JFrame implements ListSelectionListener ,ActionListener{
private JList list;
private JList list2;
private JLabel text;
private JLabel label;
private JTextField input;
private JButton btn;
private DefaultListModel model;
private final String [] item = {"日本","イギリス","ロシア","アメリカ","フランス","ドイツ"};
public static void main(String [] arges){ new GuiJList();}
public GuiJList(){
setTitle("JavaでGUIその4");
setSize(400,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
text = new JLabel("未選択項目");
list = new JList(item);
btn = new JButton("追加");
input = new JTextField(10);
label = new JLabel("項目を追加");
model = new DefaultListModel();
for (String str : item) model.addElement(str);
list2 = new JList(model);
btn.addActionListener(this);
list.addListSelectionListener(this);
list2.addListSelectionListener(this);
input.addActionListener(this);
JPanel left = new JPanel(new BorderLayout());
JPanel right = new JPanel(new BorderLayout());
JPanel panel = new JPanel();
left.add(list,BorderLayout.CENTER);
left.add(text,BorderLayout.SOUTH);
panel.add(label);
panel.add(input);
panel.add(btn);
right.add(panel,BorderLayout.SOUTH);
right.add(list2,BorderLayout.CENTER);
add(left);
add(right);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("追加") | (e.getSource()).equals(input)) model.addElement(input.getText());
}
public void valueChanged(ListSelectionEvent e){
StringBuilder builder = new StringBuilder();
for(int i = 0; i < item.length; i++) if(list.isSelectedIndex(i)) builder.append(item[i]);
text.setText(new String(builder));
}
}
実行結果

左のリストを選択すると下に表示されます
下にある追加ボタンを押すとテキストボックスの内容が右のリストに追加されます
問題点:実際に起動させて項目を追加させて見るとウィンドウサイズがおかしくなる
今回のプログラムは上記の問題点があるためいろいろ反省しています。
次回は似たような動作の部品であるコンボボックスにしようかな~