Swing/TransparentTableHeader のバックアップの現在との差分(No.2)
TITLE:JTableのヘッダを透明化
Posted by aterai at 2011-04-04
JTableのヘッダを透明化
JTableのヘッダ背景、セル間の垂直罫線を非表示にします。-
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:
hreflang:
href: https://java-swing-tips.blogspot.com/2011/04/transparent-jtableheader.html lang: en
概要
JTable
のヘッダ背景、セル間の垂直罫線を非表示にします。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
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(0, true);
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(value!=null?value.toString():"");
this.setHorizontalAlignment(JLabel.CENTER);
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;
}
}
解説
- JTableHeader
- JTableHeaderとヘッダレンダラーの両方を、setOpaque(false), 背景色: Color(0, true) と設定
- JTable, JScrollPane(Viewport, ColumnHeader)も setOpaque(false), 背景色: Color(0, true)と設定
- 背景パターンは、JScrollPane#paintComponent(...)をオーバーライドして描画
- JTableを半透明にするは、JViewport#paintComponent(...)をオーバーライド
- 背景パターンは、JScrollPane#paintComponent(...)をオーバーライドして描画
- VerticalLine
- セル間の垂直線を非表示: table.setShowVerticalLines(false);
- セル間の幅を0にして、選択時に罫線のあとが表示されないように設定: table.setIntercellSpacing(new Dimension(0,1));
- Boolean.classのDefaultRenderer
- 透明化したBooleanCellRendererやBooleanCellEditorを設定
解説
-
JTableHeader
-
JTableHeader
とヘッダセルレンダラーの背景を透明:setOpaque(false)
、かつ背景色:Color(0x0, true)
に設定
-
-
JTable
、JScrollPane
(Viewport
、ColumnHeader
)の背景も透明:setOpaque(false)
、かつ背景色:Color(0x0, true)
に設定- 背景パターンは
JScrollPane#paintComponent(...)
をオーバーライドして描画- JTableを半透明にするは
JViewport#paintComponent(...)
をオーバーライド
- JTableを半透明にするは
- 背景パターンは
-
VerticalLine
- セル間の垂直線を
table.setShowVerticalLines(false)
で非表示に設定 - セル間の幅を
table.setIntercellSpacing(new Dimension(0, 1))
で0
に設定して選択時に罫線の跡を非表示化
- セル間の垂直線を
-
Boolean.class
のDefaultRenderer
- 透明化した
BooleanCellRenderer
やBooleanCellEditor
を設定
- 透明化した
- 注:
-
ColumnHeader
にはscroll.setColumnHeader(new JViewport())
のように適当な空JViewport
などを設定しておかないとNullPointerException
が発生する#spanend #spanadd scroll.setOpaque(false); #spanend #spanadd scroll.setBackground(alphaZero); #spanend #spanadd scroll.getViewport().setOpaque(false); #spanend #spanadd scroll.getViewport().setBackground(alphaZero); #spanend #spanadd scroll.setColumnHeader(new JViewport()); // Empty JViewport #spanend #spanadd scroll.getColumnHeader().setOpaque(false); #spanend #spanadd scroll.getColumnHeader().setBackground(alphaZero); #spanend #spanadd
-
参考リンク
- レンダラーとして使用している
JCheckBox
の揃えをupdateUI()
メソッドをオーバーライドしてsetHorizontalAlignment(SwingConstants.CENTER)
で中央に変更していたが無効になっている?- 何時からなのか不明
-
getTableCellRendererComponent(...)
中でsetHorizontalAlignment(SwingConstants.CENTER)
を毎回設定して回避
参考リンク
- JTableを半透明にする
- JTableHeaderを非表示にする
-
JTable
のヘッダ自体を非表示にする場合のサンプル
-
- JTable#setShowVerticalLines(boolean) (Java Platform SE 8)