Swing/TransparentTableHeader の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/TransparentTableHeader へ行く。
- Swing/TransparentTableHeader の差分を削除
--- 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 --- * 概要 [#summary] `JTable`のヘッダ背景、セル間の垂直罫線を非表示にします。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TZl3Ci_GNnI/AAAAAAAAA40/wSbo6ySTlz0/s800/TransparentTableHeader.png) * サンプルコード [#sourcecode] #code(link){{ 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; } } }} * 解説 [#explanation] - `JTableHeader` -- `JTableHeader`とヘッダセルレンダラーの背景を透明:`setOpaque(false)`、かつ背景色:`Color(0x0, true)`に設定 - `JTable`、`JScrollPane`(`Viewport`、`ColumnHeader`)の背景も透明:`setOpaque(false)`、かつ背景色:`Color(0x0, true)`に設定 -- 背景パターンは`JScrollPane#paintComponent(...)`をオーバーライドして描画 --- [[JTableを半透明にする>Swing/TransparentTable]]は`JViewport#paintComponent(...)`をオーバーライド - `VerticalLine` -- セル間の垂直線を`table.setShowVerticalLines(false)`で非表示に設定 -- セル間の幅を`table.setIntercellSpacing(new Dimension(0, 1))`で`0`に設定して選択時に罫線の跡を非表示化 - `Boolean.class`の`DefaultRenderer` -- 透明化した`BooleanCellRenderer`や`BooleanCellEditor`を設定 - 注: -- `ColumnHeader`には`scroll.setColumnHeader(new JViewport())`のように適当な空 `JViewport`などを設定しておかないと`NullPointerException`が発生する #code{{ scroll.setOpaque(false); scroll.setBackground(alphaZero); scroll.getViewport().setOpaque(false); scroll.getViewport().setBackground(alphaZero); scroll.setColumnHeader(new JViewport()); // Dummy JViewport scroll.setColumnHeader(new JViewport()); // Empty JViewport scroll.getColumnHeader().setOpaque(false); scroll.getColumnHeader().setBackground(alphaZero); }} -- レンダラーとして使用している`JCheckBox`の揃えを`updateUI()`メソッドをオーバーライドして`setHorizontalAlignment(SwingConstants.CENTER)`で中央に変更していたが無効になっている? --- 何時からなのか不明 --- `getTableCellRendererComponent(...)`中で`setHorizontalAlignment(SwingConstants.CENTER)`を毎回設定して回避 * 参考リンク [#reference] - [[JTableを半透明にする>Swing/TransparentTable]] - [[JTableHeaderを非表示にする>Swing/RemoveTableHeader]] -- `JTable`のヘッダ自体を非表示にする場合のサンプル - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTable.html#setShowVerticalLines-boolean- JTable#setShowVerticalLines(boolean) (Java Platform SE 8)] * コメント [#comment] #comment #comment