• 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)に設定
  • JTableJScrollPane(ViewportColumnHeader)の背景も透明:setOpaque(false)、かつ背景色:Color(0x0, true)に設定
    • 背景パターンはJScrollPane#paintComponent(...)をオーバーライドして描画
  • VerticalLine
    • セル間の垂直線をtable.setShowVerticalLines(false)で非表示に設定
    • セル間の幅をtable.setIntercellSpacing(new Dimension(0, 1))0に設定して選択時に罫線の跡を非表示化
  • 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);
      
  • レンダラーとして使用しているJCheckBoxの揃えをupdateUI()メソッドをオーバーライドしてsetHorizontalAlignment(SwingConstants.CENTER)で中央に変更していたが無効になっている?
    • 何時からなのか不明
    • getTableCellRendererComponent(...)中でsetHorizontalAlignment(SwingConstants.CENTER)を毎回設定して回避

参考リンク

コメント