String以外のオブジェクトを使う
実際に、独自のデータクラスを定義してJListで利用してみましょう。ここでは、名前と年齢を管理する「MyData」というクラスを定義して、これを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;
private DefaultListModel model;
public SampleApp(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
model = new DefaultListModel();
model.addElement(new MyData("山田太郎",36));
model.addElement(new MyData("田中花子",24));
model.addElement(new MyData("中村小太郎",12));
list = new JList(model);
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){
MyData data = (MyData)obj;
result += data.getName() + " ";
}
label.setText(result);
}
public static void main(String[] args) {
new SampleApp().setVisible(true);
}
}
class MyData {
private String name;
private int age;
public MyData(String s,int n){
this.name = s;
this.age = n;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "名前:" + this.name + "(" + this.age + "歳)";
}
}
MyDataを保管したJList。ちゃんと表示も、選択された項目も機能する。 |
ここでは、MyDataクラスを定義し、これを使ってJListに項目を表示させています。ポイントの1つは、「toString」メソッドの定義です。組み込んだインスタンスがJListに表示されるとき、そのインスタンスのtoStringの値を表示するようになっています。そこで、toStringをオーバーライドしておけば、独自の表示を用意することができるのです。
また、このJListでMyDataしか保管しないことがわかっているのなら、項目を扱う処理では、Objectとして取り出したものをすべてMyDataにキャストして利用するようにしましょう。
この「独自クラスをJListで使う」基本がわかれば、さまざまな独自に定義したデータを、そのままJListで利用できるようになります。これは、かなり便利ではないでしょうか。この拡張性こそ、AWTのListとJListの大きな違いなのですね。