TITLE:JListで異なる高さのセルを使用

JListで異なる高さのセルを使用

編集者:Terai Atsuhiro
作成日:2006-05-15
更新日:2021-07-29 (木) 03:56:43

概要

JListのレンダラーにJTextAreaを使って、異なる高さのセルを作成します。

#screenshot

サンプルコード

 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;

解説

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

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

JTextAreaにセルフォーカスがある状態を表現するために、EmptyBorderを継承して作成したDotBorderを使用しています。

コメント