概要

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()); // Empty JViewport
      scroll.getColumnHeader().setOpaque(false);
      scroll.getColumnHeader().setBackground(alphaZero);
      
  • レンダラーとして使用しているJCheckBoxの揃えをupdateUI()メソッドをオーバーライドしてsetHorizontalAlignment(SwingConstants.CENTER)で中央に変更していたが無効になっている?
    • 何時からなのか不明
    • getTableCellRendererComponent(...)中でsetHorizontalAlignment(SwingConstants.CENTER)を毎回設定して回避

参考リンク

コメント