• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableを半透明にする
#navi(../)
RIGHT:Posted by [[aterai]] at 2010-08-02
#tags()
RIGHT:Posted by &author(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{{
#code(link){{
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;
          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!]
-[[JTableのヘッダを透明化>Swing/TransparentTableHeader]]

**コメント [#u87975c6]
#comment