し上を行く JList を表示したい,の巻
2000.11.16 新規

ここで扱っている「少し上を行く JList 」とは、文字列と一緒にアイコンを表示させるというものです。 実際には、下のような JList です。

JList のサンプル

この例で表示しているリスト中の文字列は

というように定義しています。

このような JList を表示するには JList のサブクラスを新たに作成するのではなく、 リスト内のセルを実際に描画している ListCellRenderer のサブクラスを作って、それを JList に適用させます。 JList に適用させるのは簡単で、JList#setCellRenderer(ListCellRenderer) メソッドを使用します。

ListCellRenderer のサブクラスを作成するには、サンプルのソースコードを下に載せているので参考にしてください。 ポイントは、親クラスの getListCellRendererComponent() メソッドを呼び出して、そのコンポーネントを(メソッド内のみですが)保持しておくことです。 一見すると、戻り値としてのみ使用しているだけなのでムダのようにも見えます。 しかし、こうしないと実際にはアイコンが表示されません。
ちなみに、Java2SDK1.2 のときには

    return super.getListCellRendererComponent(l,str.substring(1)
      ,modelIndex,isSelected,cellHasFocus);
という書式でもアイコン表示はされていました。 バージョンが上がったときに実装が若干変更されたようです。


「SampleListCellRenderer.java」のソースコード
import java.awt.*;
import javax.swing.*;

/**
 * リスト内にある各セルの描画方法を決定するクラスです.
 * 
 * @author Musi_chan
 * (Musi_chan@cool.biglobe.ne.jp)
 * @version 2000/11/16 20:29
 */
public class SampleListCellRenderer extends DefaultListCellRenderer {
/******************************************************************************
  フィールド
******************************************************************************/

/******************************************************************************
  コンストラクタ
******************************************************************************/

/******************************************************************************
  メソッド
******************************************************************************/
  /**
   * リスト内のセルを描画方法を決定するメソッドです.
   * リスト中の文字列は
   * <UL>
   * <LI>1文字目がアイコン用インデックス
   * <LI>2文字目が実際の表示内容
   * </UL>
   * というように定義します.
   * 
   * @param l ペイントしているリスト
   * @param value list.getModel().getElementAt(index)によって返される値
   * @param modelIndex セルのインデックス
   * @param isSelected 指定のセルが選択された場合にtrue
   * @param cellHasFocus 指定のセルにフォーカスがある場合にtrue
   * @return 指定の値を描画するpaint()メソッドがあるコンポーネント
   * @see javax.swing.ListCellRenderer
   * @see javax.swing.DefaultListCellRenderer
   */
  public Component getListCellRendererComponent(JList l,Object value
    ,int modelIndex,boolean isSelected,boolean cellHasFocus) {

    // リスト内のセル
    Component c;
    // 表示文字列保持用ローカル変数
    String str;

    // 表示文字列にキャスト
    str=(String)value;
    // リスト内のセルを取得
    c=super.getListCellRendererComponent(l,str.substring(1)
      ,modelIndex,isSelected,cellHasFocus);

    // 表示アイコンの設定
    switch(str.charAt(0)) {
    default:
      setIcon(/*ImageIcon を用意してください*/);
      break;
    case '0':
      setIcon(/*ImageIcon を用意してください*/);
      break;
    }
    // 好みによって文字列の位置を調節
    setVerticalTextPosition(SwingConstants.BOTTOM);

    return c;
  }
}

戻る