モジュール java.desktop
パッケージ javax.swing

クラスJList<E>

java.lang.Object
型パラメータ:
E - このリストの要素の型
すべての実装されたインタフェース:
ImageObserver, MenuContainer, Serializable, Accessible, Scrollable

@JavaBean(defaultProperty="UI", description="A component which allows for the selection of one or more objects from a list.") public class JList<E> extends JComponent implements Scrollable, Accessible
オブジェクトのリストを表示し、ユーザーが1つまたは複数のオブジェクトを選択できるようにするコンポーネントです。 別のモデルであるListModelが、リストの内容を保持します。

読取り専用のListModelのインスタンスを自動生成するJListコンストラクタを使用すれば、オブジェクトの配列またはVectorを簡単に表示できます。

 
 // Create a JList that displays strings from an array

 String[] data = {"one", "two", "three", "four"};
 JList<String> myList = new JList<String>(data);

 // Create a JList that displays the superclasses of JList.class, by
 // creating it with a Vector populated with this data

 Vector<Class<?>> superClasses = new Vector<Class<?>>();
 Class<JList> rootClass = javax.swing.JList.class;
 for(Class<?> cls = rootClass; cls != null; cls = cls.getSuperclass()) {
     superClasses.addElement(cls);
 }
 JList<Class<?>> myList = new JList<Class<?>>(superClasses);

 // The automatically created model is stored in JList's "model"
 // property, which you can retrieve

 ListModel<Class<?>> model = myList.getModel();
 for(int i = 0; i < model.getSize(); i++) {
     System.out.println(model.getElementAt(i));
 }
 
 

コンストラクタまたはsetModelメソッドを使用して、ListModelJListに直接指定できます。 コンテンツがstaticである必要はありません。項目数や項目の値は、時間の経過とともに変化してもかまいません。 ListModelが正しく実装されていれば、変更が発生するたびに、追加されたjavax.swing.event.ListDataListenerのセットに通知が送られます。 これらの変更は、修正、追加または削除されたリスト・インデックスの範囲を識別するjavax.swing.event.ListDataEventによって記述されます。 JListListUIは、モデルの変更を待機することによって、視覚表現が常に最新の状態になるようにします。

単純な動的コンテンツのJListアプリケーションは、DefaultListModelクラスを使用してリスト要素を管理できます。 このクラスは、ListModelインタフェースを実装し、java.util.Vectorと同様のAPIも提供します。 一方、カスタムListModel実装を必要とするアプリケーションは、リスナーの管理および通知に関する基本機能を提供するAbstractListModelのサブクラスとすることができます。 たとえば、AbstractListModelの読取り専用実装の場合、次のようになります。

 
 // This list model has about 2^16 elements.  Enjoy scrolling.

 ListModel<String> bigData = new AbstractListModel<String>() {
     public int getSize() { return Short.MAX_VALUE; }
     public String getElementAt(int index) { return "Index " + index; }
 };
 
 

JListの選択状態は、ListSelectionModelのインスタンスである別のモデルによって管理されます。 JListは、構築時に選択モデルによって初期化され、また、この選択モデルの照会や設定を行う各メソッドを含んでいます。 JListは、選択を簡単に管理できる便利なメソッドも提供します。 たとえばsetSelectedIndexgetSelectedValueなどのカバー・メソッドでは、選択モデルとのやりとりの詳細を管理できます。 デフォルトでは、JListの選択モデルは、任意の項目の組み合わせを一度に選択できるように設定されます(MULTIPLE_INTERVAL_SELECTION選択モード)。 選択モードは、選択モデル上で直接変更するか、JListのカバー・メソッドを使って変更します。 ユーザーのジェスチャに応じて選択モデルを更新する処理は、リストのListUIによって行われます。

ListSelectionModelが正しく実装されていれば、選択が変更されるたびに追加されたjavax.swing.event.ListSelectionListenerのセットに通知が送られます。 これらの変更は、選択範囲の変更を識別するjavax.swing.event.ListSelectionEventによって記述されます。

リスト選択の変更をリスンする方法としては、JListに直接ListSelectionListenerを追加することをお勧めします。 JListは、選択モデルをリスニングし、リスナーに変更を通知します。

リストの視覚表現を常に最新の状態にしておくため、選択の変更を待機する処理は、リストのListUIによって行われます。

JList内のセルのペイントは、リスト上にcellRendererプロパティとしてインストールされた、セル・レンダラと呼ばれる委譲によって処理されます。 このレンダラは、「ゴムスタンプ」のように使用してセルをペイントできるjava.awt.Componentを提供します。 セルをペイントする必要が生じるたびに、リストのListUIはセル・レンダラにコンポーネントを要求し、それを適切な位置に移動した後、paintメソッドを使用してセルのコンテンツをペイントします。 JLabelコンポーネントを使用してレンダリングを行うデフォルトのセル・レンダラは、リストのListUIによってインストールされます。 次のようなコードにより、独自のレンダラを使用することもできます。

 
  // Display an icon and a string for each object in the list.

 class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
     static final ImageIcon longIcon = new ImageIcon("long.gif");
     static final ImageIcon shortIcon = new ImageIcon("short.gif");

     // This is the only method defined by ListCellRenderer.
     // We just reconfigure the JLabel each time we're called.

     public Component getListCellRendererComponent(
       JList<?> list,           // the list
       Object value,            // value to display
       int index,               // cell index
       boolean isSelected,      // is the cell selected
       boolean cellHasFocus)    // does the cell have focus
     {
         String s = value.toString();
         setText(s);
         setIcon((s.length() > 10) ? longIcon : shortIcon);
         if (isSelected) {
             setBackground(list.getSelectionBackground());
             setForeground(list.getSelectionForeground());
         } else {
             setBackground(list.getBackground());
             setForeground(list.getForeground());
         }
         setEnabled(list.isEnabled());
         setFont(list.getFont());
         setOpaque(true);
         return this;
     }
 }

 myList.setCellRenderer(new MyCellRenderer());
 
 

セル・レンダリングの別のジョブは、リストのサイズ情報の特定にも役立ちます。 デフォルトでは、リストのListUIがセル・レンダリングに各リスト項目の推奨サイズを問い合わせることによって、セルのサイズを決定します。 リストの項目数が多い場合、この処理は負荷が大きくなります。 これらの計算を回避するには、リスト上にfixedCellWidthfixedCellHeightを設定するか、これらの値が単一のプロトタイプ値に基づいて自動計算されるように設定します。

 
 JList<String> bigDataList = new JList<String>(bigData);

 // We don't want the JList implementation to compute the width
 // or height of all of the list cells, so we give it a string
 // that's as big as we'll need for any cell.  It uses this to
 // compute values for the fixedCellWidth and fixedCellHeight
 // properties.

 bigDataList.setPrototypeCellValue("Index 1234567890");
 
 

JListはスクロールを直接実装していません。 スクロール・リストを作成するには、これをJScrollPaneのビューポート・ビューとして設定します。 たとえば:

 JScrollPane scrollPane = new JScrollPane(myList);

 // Or in two steps:
 JScrollPane scrollPane = new JScrollPane();
 scrollPane.getViewport().setView(myList);
 

JListは、ダブルクリックやトリプル・クリック(またはそれ以上の回数のクリック)のような特別な処理は行いませんが、これらのイベントの発生時にアクションを実行したい場合は、MouseListenerを簡単に追加できます。 クリックされたセルを調べるには、locationToIndexメソッドを使用します。 たとえば:

 MouseListener mouseListener = new MouseAdapter() {
     public void mouseClicked(MouseEvent e) {
         if (e.getClickCount() == 2) {
             int index = list.locationToIndex(e.getPoint());
             System.out.println("Double clicked on Item " + index);
          }
     }
 };
 list.addMouseListener(mouseListener);
 

警告: Swingはスレッドに対して安全ではありません。 詳細は、「Swing's Threading Policy」を参照してください。

警告: このクラスの直列化されたオブジェクトは、今後のSwingリリースと互換ではなくなる予定です。 現在の直列化のサポートは、短期間の格納や、同じバージョンのSwingを実行するアプリケーション間のRMIに適しています。 1.4では、すべてのJavaBeansの長期ストレージのサポートがjava.beansパッケージに追加されました。 XMLEncoderを参照してください。

詳細は、「The Java Tutorial」の「How to Use Lists」を参照してください。

導入されたバージョン:
1.2
関連項目: