モデルクラスとは?
よりJListを使いこなそうとなると、項目の追加や削除といったことも行いたくなるでしょう。が、JListをいくら調べても、項目を操作する機能が見当たらないのです。ということは? JListには項目を操作する機能はないのでしょうか?
実は、「ない」のです。というのも、実は今やったように、表示する項目を配列でJListに渡して表示させるという方法は、JListの使い方からすればかなり一般的ではないものなのです。要するに、「ちょっと利用したい、という人向けに、簡単な方法も用意しておきました」というものなのですね。
では、JList本来の使い方とは、どういうものか。――それは、「モデル」を利用する方法です。モデルとは、データを構造的に管理するためのクラスです。JListに表示するデータを、このモデルとして定義し、それをJListに組み込んで表示を行わせる、それがJListの基本的な使い方なのです。
このように「コンポーネントの機能はJListで操作する」「データは、モデルクラスで管理する」というようにコンポーネントとデータを完全に切り分けることによって、複雑なデータも管理しやすくしているのですね。
このモデルクラスには、さまざまなものがあります。コンポーネントが違えばデータの構造も違いますから、モデルクラスも違ってくるのです。JListの場合は、「ListModel」というインターフェイスが用意されています。これを実装して、モデルクラスを作成すればよいわけです。といっても、全部作るのは面倒ですので、実装済みのすぐに使えるクラスとして「DefaultListModel」というクラスがSwingには用意されています。
では、このDefaultListModelを組み込んで、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 ActionListener {
private static final long serialVersionUID = 1L;
private JTextField field;
private JList list;
private DefaultListModel model;
public SampleApp(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
model = new DefaultListModel();
model.addElement("Windows");
model.addElement("Linux");
model.addElement("Mac OS X");
list = new JList(model);
this.add(list,BorderLayout.CENTER);
field = new JTextField();
field.addActionListener(this);
this.add(field,BorderLayout.NORTH);
this.setSize(new Dimension(300,200));
}
@Override
public void actionPerformed(ActionEvent e) {
String s = field.getText();
model.addElement(s);
}
public static void main(String[] args) {
new SampleApp().setVisible(true);
}
}