概要

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 all

解説

  • 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);
      

参考リンク

コメント