Swing/TransparentTable のバックアップ差分(No.3)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/TransparentTable へ行く。
- 1 (2010-08-02 (月) 19:24:12)
- 2 (2011-01-26 (水) 21:27:19)
- 3 (2011-07-21 (木) 21:55:18)
- 4 (2012-12-28 (金) 12:44:08)
- 5 (2013-10-24 (木) 14:09:55)
- 6 (2013-12-10 (火) 10:35:28)
- 7 (2014-11-22 (土) 03:59:58)
- 8 (2014-12-01 (月) 18:48:27)
- 9 (2015-04-08 (水) 17:13:23)
- 10 (2015-06-22 (月) 17:56:34)
- 11 (2016-02-06 (土) 18:18:51)
- 12 (2017-07-05 (水) 13:54:10)
- 13 (2018-02-24 (土) 19:51:30)
- 14 (2018-07-05 (木) 15:57:06)
- 15 (2019-01-22 (火) 18:25:39)
- 16 (2020-11-28 (土) 13:30:30)
- 17 (2023-01-20 (金) 17:39:55)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTableを半透明にする
#navi(../)
RIGHT:Posted by [[aterai]] at 2010-08-02
*JTableを半透明にする [#n1e3aa38]
JTableに透明、半透明の背景色を設定します。
-&jnlp;
-&jar;
-&zip;
//#screenshot
#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTV-0biw5I/AAAAAAAAAog/GI9-wLqeOK8/s800/TransparentTable.png)
**サンプルコード [#u6a06559]
#code{{
JScrollPane scroll = new JScrollPane(table) {
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;
g2.setPaint(texture);
g2.fillRect(0,0,getWidth(),getHeight());
}
super.paintComponent(g);
}
};
}
};
final Color alphaZero = new Color(0, true);
table.setOpaque(false);
table.setBackground(alphaZero);
scroll.getViewport().setOpaque(false);
scroll.getViewport().setBackground(alphaZero);
}}
**解説 [#o0880a1f]
上記のサンプルでは、JViewportとJTableのそれぞれにsetOpaque(false), setBackground(new Color(0, true));と設定することで、透明なJTableを作成しています。画像はJViewportのpaintComponentメソッドをオーバーライドすることで表示しています。
----
JTableのCellEditorは、JTable#prepareEditor(...)をオーバーライドして、以下のように設定しています。
-JTextField: Object.classのデフォルト
--常にsetOpaque(false);
-JCheckBox: Boolean.classのデフォルト
--常にsetBackground(JTable#getSelectionBackground());
----
JTableの背景色にアルファ値を設定して透過性を持たせた場合、デフォルトのBooleanRendererでは色が濃くなる(二重に描画される?)ので、paintComponentメソッドを以下のようにオーバーライドしています。
#code{{
class TranslucentBooleanRenderer extends JCheckBox implements TableCellRenderer {
private final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
public TranslucentBooleanRenderer() {
super();
setHorizontalAlignment(JLabel.CENTER);
setBorderPainted(true);
}
@Override public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if(isSelected) {
setOpaque(true);
setForeground(table.getSelectionForeground());
super.setBackground(table.getSelectionBackground());
}else{
setOpaque(false);
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setSelected((value != null && ((Boolean)value).booleanValue()));
if(hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
}else{
setBorder(noFocusBorder);
}
return this;
}
@Override protected void paintComponent(Graphics g) {
if(!isOpaque()) {
g.setColor(getBackground());
g.fillRect(0,0,getWidth(),getHeight());
}
super.paintComponent(g);
}
}
}}
**参考リンク [#ia2fc942]
-[http://www.viva-edo.com/komon/edokomon.html 江戸の文様(和風素材・デスクトップ壁紙)]
-[[JTextFieldの背景色を半透明にする>Swing/TranslucentTextField]]
-[http://java.sun.com/products/jfc/tsc/articles/swing2d/index.html Unleash Your Creativity with Swing and the Java 2D API!]
**コメント [#u87975c6]
#comment