Swing/TransparentTable のバックアップの現在との差分(No.3)
TITLE:JTableを半透明にする
Posted by aterai at 2010-08-02
JTableを半透明にする
JTableに透明、半透明の背景色を設定します。-
category: swing
folder: TransparentTable
title: JTableを半透明にする
tags: [JTable, Transparent, Translucent, TableCellEditor, JViewport, JCheckBox]
author: aterai
pubdate: 2010-08-02T19:24:12+09:00
description: JTable自体をsetOpaque(false)で透明に、またセル描画に使用されるJTableの背景色を半透明にするなどの設定で、半透明のJTableを作成します。
image:
- &jnlp;
- &jar;
- &zip;
hreflang:
href: https://java-swing-tips.blogspot.com/2010/08/transparent-translucent-jtable.html lang: en
概要
JTable
自体をsetOpaque(false)
で透明に、またセル描画に使用されるJTable
の背景色を半透明にするなどの設定で、半透明のJTable
を作成します。
Screenshot

Advertisement
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
JScrollPane scroll = new JScrollPane(table) {
private final TexturePaint texture = makeImageTexture();
private final TexturePaint texture = makeImageTexture();
@Override protected JViewport createViewport() {
return new JViewport() {
@Override public void paintComponent(Graphics g) {
if(texture!=null) {
Graphics2D g2 = (Graphics2D)g;
@Override protected void paintComponent(Graphics g) {
if (texture != null) {
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(texture);
g2.fillRect(0,0,getWidth(),getHeight());
g2.fillRect(0, 0, getWidth(), getHeight());
}
super.paintComponent(g);
}
};
}
};
#spandel
final Color alphaZero = new Color(0, true);
#spanend
#spanadd
Color alphaZero = new Color(0x0, true);
#spanend
table.setOpaque(false);
table.setBackground(alphaZero);
scroll.getViewport().setOpaque(false);
scroll.getViewport().setBackground(alphaZero);
解説
上記のサンプルでは、JViewportとJTableのそれぞれにsetOpaque(false), setBackground(new Color(0, true));と設定することで、透明なJTableを作成しています。画像はJViewportのpaintComponentメソッドをオーバーライドすることで表示しています。解説
上記のサンプルでは、JViewport
とJTable
のそれぞれにsetOpaque(false)
、setBackground(new Color(0x0, true));
と設定することで透明なJTable
を作成しています。テクスチャ画像はJViewport
のpaintComponent(...)
メソッドをオーバーライドして表示しています。
JTableのCellEditorは、JTable#prepareEditor(...)をオーバーライドして、以下のように設定しています。
- JTextField: Object.classのデフォルト
- 常にsetOpaque(false);
- JCheckBox: Boolean.classのデフォルト
- 常にsetBackground(JTable#getSelectionBackground());
-
JTable
のCellEditor
はJTable#prepareEditor(...)
をオーバーライドして、以下のように設定-
JTextField
:Object.class
のデフォルト- 常に
setOpaque(false);
- 常に
-
JCheckBox
:Boolean.class
のデフォルト- 常に
setBackground(JTable#getSelectionBackground());
- 常に
-
JTableの背景色にアルファ値を設定して透過性を持たせた場合、デフォルトのBooleanRendererでは色が濃くなる(二重に描画される?)ので、paintComponentメソッドを以下のようにオーバーライドしています。
-
JTable
の背景色にアルファ値を設定して透過性を持たせた場合、デフォルトのBooleanRenderer
では色が濃くなる(重複して描画されてしまう)のでpaintComponent(...)
メソッドを以下のようにオーバーライドして回避
class TranslucentBooleanRenderer extends JCheckBox implements TableCellRenderer {
private final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
public TranslucentBooleanRenderer() {
super();
setHorizontalAlignment(JLabel.CENTER);
setHorizontalAlignment(SwingConstants.CENTER);
setBorderPainted(true);
}
#spanadd
#spanend
@Override public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if(isSelected) {
setHorizontalAlignment(SwingConstants.CENTER);
if (isSelected) {
setOpaque(true);
setForeground(table.getSelectionForeground());
super.setBackground(table.getSelectionBackground());
}else{
} else {
setOpaque(false);
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setSelected((value != null && ((Boolean)value).booleanValue()));
if(hasFocus) {
setSelected((value != null && ((Boolean) value).booleanValue()));
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
}else{
} else {
setBorder(noFocusBorder);
}
return this;
}
#spanadd
#spanend
@Override protected void paintComponent(Graphics g) {
if(!isOpaque()) {
if (!isOpaque()) {
g.setColor(getBackground());
g.fillRect(0,0,getWidth(),getHeight());
g.fillRect(0, 0, getWidth(), getHeight());
}
super.paintComponent(g);
}
}
参考リンク
参考リンク
- 江戸の文様(和風素材・デスクトップ壁紙)
- JTextFieldの背景色を半透明にする
- Unleash Your Creativity with Swing and the Java 2D API!
- JTableのヘッダを透明化