• category: swing folder: TransparentTableHeader title: JTableのヘッダを透明化 tags: [JTable, JTableHeader, Transparent, JScrollPane, JViewport, TableCellRenderer, TableCellEditor] author: aterai pubdate: 2011-04-04T16:49:46+09:00 description: JTableのヘッダ背景、セル間の垂直罫線を非表示にします。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TZl3Ci_GNnI/AAAAAAAAA40/wSbo6ySTlz0/s800/TransparentTableHeader.png hreflang:
       href: https://java-swing-tips.blogspot.com/2011/04/transparent-jtableheader.html
       lang: en

概要

JTableのヘッダ背景、セル間の垂直罫線を非表示にします。

サンプルコード

class TransparentHeader extends JLabel implements TableCellRenderer {
  private final Border b = BorderFactory.createCompoundBorder(
      BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK),
      BorderFactory.createEmptyBorder(2, 2, 1, 2));
  private final Color alphaZero = new Color(0x0, true);
  @Override public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    this.setText(Objects.toString(value, ""));
    this.setHorizontalAlignment(SwingConstants.CENTER);
    this.setOpaque(false);
    this.setBackground(alphaZero);
    this.setForeground(Color.BLACK);
    this.setBorder(b);
    return this;
  }
}
View in GitHub: Java, Kotlin

解説

  • JTableHeader
    • JTableHeaderとヘッダセルレンダラーの両方を、setOpaque(false), 背景色: Color(0x0, true)と設定
  • JTable, JScrollPane(Viewport, ColumnHeader)もsetOpaque(false), 背景色: Color(0x0, true)と設定
    • 背景パターンは、JScrollPane#paintComponent(...)をオーバーライドして描画
  • VerticalLine
    • セル間の垂直線を非表示: table.setShowVerticalLines(false);
    • セル間の幅を0にして、選択時に罫線のあとが表示されないように設定: table.setIntercellSpacing(new Dimension(0, 1));
  • Boolean.classDefaultRenderer
    • 透明化したBooleanCellRendererBooleanCellEditorを設定
  • 注:
    • ColumnHeaderには、scroll.setColumnHeader(new JViewport());とダミーのJViewportを設定しておかないと、NullPointerExceptionが発生する
      scroll.setOpaque(false);
      scroll.setBackground(alphaZero);
      scroll.getViewport().setOpaque(false);
      scroll.getViewport().setBackground(alphaZero);
      scroll.setColumnHeader(new JViewport()); // Dummy JViewport
      scroll.getColumnHeader().setOpaque(false);
      scroll.getColumnHeader().setBackground(alphaZero);
      

参考リンク

コメント