java 第36回  JListクラス | whichのブログ ~プログラミング体験記~

whichのブログ ~プログラミング体験記~

主にJava,vVsual C#,Andoroid,SQLについて
覚え基本た文法やプログラミング技法、各クラスの利用法を
忘れないように形にしたものです

初心者だとかプロだとか特に意識せず利用してもらえるとうれしいです。

■JList  
リストという言葉から連想できるのは名簿だとかカタログみたいな資料ですが、 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なし選択された項目の値を取得
このクラスのメソッドは上記のように「setSelected~:設定」、「isSelected~:状態」、「getSelected:~取得」という風に他の部品と地味に異なるためこの部品は、部品自体と選択項目を別々に設定する必要がある特殊な部品なのだ。

配列を利用して選択項目設定するということは項目が固定されてしまっている。
これでは追加・変更・削除などデータ項目に対する基本的な操作が仕様上不可能なプログラムになる(変更自体は見かけ上はできる)

■DefaultListModel
JListクラス選択項目編集する目的で提供するクラスです。イメージとしては動的配列が近いです。

メソッド

操作メソッド返却値引数説明
追加add(int index , Object values)なし項目番号、項目値引数で指定した位置に項目を追加
追加addElement(Object)なし項目値リストの最後に項目を追加
削除remove(int index)なし項目番号引数の項目番号の項目を削除
削除removeElement(Object values)なし項目値項目値を削除
他にも、「get(int index)」、「elementAt(int index)」というメソッドをつかって値を取得するすることもできますが、
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));
}
}

実行結果

左のリストを選択すると下に表示されます


下にある追加ボタンを押すとテキストボックスの内容が右のリストに追加されます

問題点:実際に起動させて項目を追加させて見るとウィンドウサイズがおかしくなる

今回のプログラムは上記の問題点があるためいろいろ反省しています。

次回は似たような動作の部品であるコンボボックスにしようかな~