TITLE:JTableに行ヘッダを追加

JTableに行ヘッダを追加

編集者:Terai Atsuhiro~

作成日:2006-09-04
更新日:2022-09-27 (火) 17:29:54
  • category: swing folder: TableRowHeader title: JTableに行ヘッダを追加 tags: [JTable, JList, JScrollPane] author: aterai pubdate: 2006-09-04T01:10:03+09:00 description: JTableを設定したJScrollPaneのRowHeaderViewに、JListで作成した行ヘッダを追加します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTUk9YzW7I/AAAAAAAAAmQ/wjin9CuyfBg/s800/TableRowHeader.png hreflang:
       href: https://java-swing-tips.blogspot.com/2011/01/jtable-rowheader.html
       lang: en

概要

JTableを設定したJScrollPaneRowHeaderViewに、JListで作成した行ヘッダを追加します。

概要

JTableに行ヘッダを追加を追加します。

サンプルコード

#spanend
#spanadd
class RowHeaderList<E> extends JList<E> {
#spanend
  private final JTable table;
  private final ListSelectionModel tableSelection;
  private final ListSelectionModel rListSelection;
  private int rollOverRowIndex = -1;
  private int pressedRowIndex  = -1;

#spandel
#screenshot
#spanend
  public RowHeaderList(ListModel<E> model, JTable table) {
    super(model);
    this.table = table;
    setFixedCellHeight(table.getRowHeight());
    setCellRenderer(new RowHeaderRenderer<E>(table.getTableHeader()));
    RollOverListener rol = new RollOverListener();
    addMouseListener(rol);
    addMouseMotionListener(rol);

#spandel
**サンプルコード [#kfa64240]
#spanend
 class RowHeaderList extends JList {
   private final JTable table;
   private final ListSelectionModel tableSelection;
   private final ListSelectionModel rListSelection;
   public RowHeaderList(ListModel model, JTable table) {
     super(model);
     this.table = table;
     setFixedCellHeight(table.getRowHeight());
     setCellRenderer(new RowHeaderRenderer(table.getTableHeader()));
     RollOverListener rol = new RollOverListener();
     addMouseListener(rol);
     addMouseMotionListener(rol);
     tableSelection = table.getSelectionModel();
     rListSelection = getSelectionModel();
   }
   class RowHeaderRenderer extends JLabel implements ListCellRenderer {
     private final JTableHeader header;
     public RowHeaderRenderer(JTableHeader header) {
       this.header = header;
       this.setOpaque(true);
       //this.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
       this.setBorder(BorderFactory.createMatteBorder(0,0,1,2,Color.gray));
       this.setHorizontalAlignment(CENTER);
       this.setForeground(header.getForeground());
       this.setBackground(header.getBackground());
       this.setFont(header.getFont());
     }
     public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
       if(index==pressedRowIndex) {
         setBackground(Color.gray);
       }else if(index==rollOverRowIndex) {
         setBackground(Color.white);
       }else if(isSelected) {
         setBackground(Color.gray.brighter());
       }else{
         setForeground(header.getForeground());
         setBackground(header.getBackground());
       }
       setText((value==null)?"":value.toString());
       return this;
     }
   }
 }
    tableSelection = table.getSelectionModel();
    rListSelection = getSelectionModel();
  }

-&jnlp;
-&jar;
-&zip;
  class RowHeaderRenderer<E> extends JLabel
                             implements ListCellRenderer<E> {
    private final JTableHeader header; // = table.getTableHeader();
    public RowHeaderRenderer(JTableHeader header) {
      super();
      this.header = header;
      this.setOpaque(true);
      // this.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
      this.setBorder(BorderFactory.createMatteBorder(
          0, 0, 1, 2, Color.GRAY.brighter()));
      this.setHorizontalAlignment(CENTER);
      this.setForeground(header.getForeground());
      this.setBackground(header.getBackground());
      this.setFont(header.getFont());
    }

#spandel
**解説 [#z757f120]
#spanend
#spandel
上記のサンプルでは、JListで作成した行ヘッダをJScrollPaneにsetRowHeaderViewメソッドで追加しています。
#spanend
    @Override public Component getListCellRendererComponent(
        JList<? extends E> list, E value, int index,
        boolean isSelected, boolean cellHasFocus) {
      if (index == pressedRowIndex) {
        setBackground(Color.GRAY);
      } else if (index == rollOverRowIndex) {
        setBackground(Color.WHITE);
      } else if (isSelected) {
        setBackground(Color.GRAY.brighter());
      } else {
        setForeground(header.getForeground());
        setBackground(header.getBackground());
      }
      setText(Objects.toString(value, ""));
      return this;
    }
  }
  // ...
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin
表の余白などに色がついているのは、テストの名残です。特に意味は無いのですが、そのまま残しています。
rowHeader.setBackground(Color.blue);
scrollPane.setBackground(Color.red);
scrollPane.getViewport().setBackground(Color.green);

解説

上記のサンプルでは、JListで作成した行ヘッダをJScrollPane#setRowHeaderView(...)メソッドで追加しています。

参考リンク

コメント

  • 不正なセルレンダラーを設定していたので修正しました。 -- terai
    #spanend
    #spanadd
    rowHeader.setBackground(Color.BLUE);
    #spanend
    #spanadd
    scrollPane.setBackground(Color.RED);
    #spanend
    #spanadd
    scrollPane.getViewport().setBackground(Color.GREEN);
    #spanend
    #spanadd
    

参考リンク

コメント