イベント処理におけるJListは?
では、このJListのイベント処理について考えてみましょう。イベント処理でJListを使うという場合、2つの理解すべき点があります。1つは「JListのイベントをどう処理するか」であり、もう1つは「JListの選択状況をどう調べるか」です。
JListのイベント処理は「ListSelectionListener」を利用するのが一般的です。これは「項目の選択状態が変更されたとき」に発生するイベントです。項目を何か操作したときに処理を行わせるなら、このイベントリスナーをJListに組み込み、メソッドを実装すればよいでしょう。では、簡単なサンプルを作成してみます。
package jp.allabout.java;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class SampleApp extends JFrame
implements ListSelectionListener{
private static final long serialVersionUID = 1L;
private JLabel label;
private JList list;
public SampleApp(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] data = {"Windows","Linux","Mac OS X"};
list = new JList(data);
this.add(list,BorderLayout.CENTER);
list.addListSelectionListener(this);
label = new JLabel("This is Sample.");
label.setFont(new Font("Serif",Font.BOLD,18));
this.add(label,BorderLayout.NORTH);
this.setSize(new Dimension(300,200));
}
@Override
public void valueChanged(ListSelectionEvent e) {
Object[] arr = list.getSelectedValues();
String result = "";
for(Object obj:arr){
result += (String)obj + " ";
}
label.setText(result);
}
public static void main(String[] args) {
new SampleApp().setVisible(true);
}
}
JListから項目を選択すると、選択された全項目名がJLabelに表示される。 |
項目を選択すると、それがJLabelに表示されます。これは一項目に限らず、いくつの項目を選択してもすべてが表示されます。
ここでは、list.addListSelectionListener(this);としてJListにListSelectionListenerを組み込んでいますね。このListSelectionListenerは、選択状態が変更されたとき、以下のメソッドを呼び出します。
public void valueChanged(ListSelectionEvent e)
このメソッドをオーバーライドすることで、イベント時の処理を行うことができます。ここでは、このクラス自身にimplementsしていますので、クラス内にメソッドを用意してあります。メソッド内では、まず、選択されているすべての項目を取得しています。
Object[] arr = list.getSelectedValues();
このgetSelectedValuesは、選択されている全項目をObject配列で返すものです。ここではJListにはString配列を渡していますから、選択されているStringが配列で返されることになります。
そこで、繰り返しを利用して配列から1つ1つ要素を取り出してはStringにキャストし一つにまとめていきます。そしてすべて整理したところでJLabelにsetTextしていた、というわけです。getSelectedValuesがわかれば、基本的に「選択された項目」を利用することはできるようになります。