Swing/TransparentTable のバックアップの現在との差分(No.8)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - 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)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- 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に透明、半透明の背景色を設定します。 description: JTable自体をsetOpaque(false)で透明に、またセル描画に使用されるJTableの背景色を半透明にするなどの設定で、半透明のJTableを作成します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTV-0biw5I/AAAAAAAAAog/GI9-wLqeOK8/s800/TransparentTable.png hreflang: href: https://java-swing-tips.blogspot.com/2010/08/transparent-translucent-jtable.html lang: en --- * 概要 [#n1e3aa38] `JTable`に透明、半透明の背景色を設定します。 * 概要 [#summary] `JTable`自体を`setOpaque(false)`で透明に、またセル描画に使用される`JTable`の背景色を半透明にするなどの設定で、半透明の`JTable`を作成します。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTV-0biw5I/AAAAAAAAAog/GI9-wLqeOK8/s800/TransparentTable.png) * サンプルコード [#u6a06559] * サンプルコード [#sourcecode] #code(link){{ 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) { @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); } }; } }; final Color alphaZero = new Color(0, true); Color alphaZero = new Color(0x0, 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`メソッドをオーバーライドすることで表示しています。 * 解説 [#explanation] 上記のサンプルでは、`JViewport`と`JTable`のそれぞれに`setOpaque(false)`、`setBackground(new Color(0x0, true));`と設定することで透明な`JTable`を作成しています。テクスチャ画像は`JViewport`の`paintComponent(...)`メソッドをオーバーライドして表示しています。 ---- `JTable`の`CellEditor`は、`JTable#prepareEditor(...)`をオーバーライドして、以下のように設定しています。 - `JTable`の`CellEditor`は`JTable#prepareEditor(...)`をオーバーライドして、以下のように設定 -- `JTextField`: `Object.class`のデフォルト --- 常に`setOpaque(false);` -- `JCheckBox`: `Boolean.class`のデフォルト --- 常に`setBackground(JTable#getSelectionBackground());` - `JTextField`: `Object.class`のデフォルト -- 常に`setOpaque(false);` - `JCheckBox`: `Boolean.class`のデフォルト -- 常に`setBackground(JTable#getSelectionBackground());` ---- `JTable`の背景色にアルファ値を設定して透過性を持たせた場合、デフォルトの`BooleanRenderer`では色が濃くなる(二重に描画される?)ので、`paintComponent`メソッドを以下のようにオーバーライドしています。 - `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); setHorizontalAlignment(SwingConstants.CENTER); setBorderPainted(true); } @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; } @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); } } }} * 参考リンク [#ia2fc942] * 参考リンク [#reference] - [http://www.viva-edo.com/komon/edokomon.html 江戸の文様(和風素材・デスクトップ壁紙)] - [[JTextFieldの背景色を半透明にする>Swing/TranslucentTextField]] - [http://web.archive.org/web/20091205092230/http://java.sun.com/products/jfc/tsc/articles/swing2d/index.html Unleash Your Creativity with Swing and the Java 2D API!] - [[JTableのヘッダを透明化>Swing/TransparentTableHeader]] * コメント [#u87975c6] * コメント [#comment] #comment #comment