• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JListで異なる高さのセルを使用
#navi(../)
RIGHT:Posted by [[aterai]] at 2006-05-15
*JListで異なる高さのセルを使用 [#v5f5cc63]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-05-15~
更新日:&lastmod;
JListのレンダラーにJTextAreaを使って、異なる高さのセルを作成します。

#contents
-&jnlp;
-&jar;
-&zip;

**概要 [#x1d27318]
JListのレンダラーにJTextAreaを使って、異なる高さのセルを作成します。
//#screenshot
#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTK2Z8UOTI/AAAAAAAAAWo/7GoDkuVX8Fc/s800/DifferentCellHeight.png)

#screenshot

**サンプルコード [#r38aaded]
#code{{
 class TextAreaRenderer extends JTextArea implements ListCellRenderer {
   private final Border border = new DotBorder(2,2,2,2);
   private final Color evenColor = new Color(230,255,230);
   public Component getListCellRendererComponent(
       JList list, Object object, int index,
       boolean isSelected, boolean cellHasFocus) {
     setText((object==null) ? "" : object.toString());
     setBorder(cellHasFocus ? border 
                 : BorderFactory.createEmptyBorder(2,2,2,2));
     if(isSelected) {
       setBackground(list.getSelectionBackground());
       setForeground(list.getSelectionForeground());
     }else{
       setBackground(index%2==0 ? evenColor : list.getBackground());
       setForeground(list.getForeground());
     }
     return this;
   }
 }
 
 private DefaultListModel makeList() {
   DefaultListModel model = new DefaultListModel();
   model.addElement("一行");
   model.addElement("一行目\n二行目");
   model.addElement("一行目\n二行目\n三行目");
   model.addElement("四行\n以上ある\nテキスト\nの場合");
   return model;
 }
class TextAreaRenderer extends JTextArea implements ListCellRenderer {
  private final Border border = new DotBorder(2,2,2,2);
  private final Color evenColor = new Color(230,255,230);
  public Component getListCellRendererComponent(
      JList list, Object object, int index,
      boolean isSelected, boolean cellHasFocus) {
    setText((object==null) ? "" : object.toString());
    setBorder(cellHasFocus ? border 
                : BorderFactory.createEmptyBorder(2,2,2,2));
    if(isSelected) {
      setBackground(list.getSelectionBackground());
      setForeground(list.getSelectionForeground());
    }else{
      setBackground(index%2==0 ? evenColor : list.getBackground());
      setForeground(list.getForeground());
    }
    return this;
  }
}

private DefaultListModel makeList() {
  DefaultListModel model = new DefaultListModel();
  model.addElement("一行");
  model.addElement("一行目\n二行目");
  model.addElement("一行目\n二行目\n三行目");
  model.addElement("四行\n以上ある\nテキスト\nの場合");
  return model;
}
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#deb3ece5]
左が複数行に対応したJList、右が通常のJListになります。左のJListでは、ListCellRendererにJTextAreaを使用しているため、テキストに\nを含めることで複数行を作成することができます。

セルの区切りを分かりやすくするために、偶数奇数で行の背景色を変更しています。

JTextAreaにセルフォーカスがある状態を表現するために、EmptyBorderを継承して作成したDotBorderを使用しています。
JTextAreaにセルフォーカスがある状態を表現するために、%%EmptyBorder%% LineBorder を継承して作成したDotBorderを使用しています。
#code{{
class DotBorder extends LineBorder {
  public boolean isBorderOpaque() {return true;}
  public DotBorder(Color color, int thickness) {
    super(color, thickness);
  }
  @Override
  public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
    Graphics2D g2 = (Graphics2D)g;
    g2.translate(x,y);
    g2.setPaint(getLineColor());
    BasicGraphicsUtils.drawDashedRect(g2, 0, 0, w, h);
    g2.translate(-x,-y);
  }
}
}}

//**参考リンク
**コメント [#h396eb78]
#comment