TITLE:JFrameを半透明化
#navi(../)
RIGHT:Posted by [[aterai]] at 2010-06-14
*JFrameを半透明化 [#ea286453]
JFrameを半透明にします。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTWw2d9LNI/AAAAAAAAApw/NXG2EcaSv_s/s800/WindowOpacity.png)

**サンプルコード [#l5dd57cc]
#code{{
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();
//com.sun.awt.AWTUtilities.setWindowOpacity(frame, .5f);
com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel p = new JPanel();
p.add(new JButton("JButton"));
p.setBackground(new Color(.5f,.8f,.5f,.5f));
frame.getContentPane().add(p);
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}}


**解説 [#v5c228ee]
com.sun.awt.AWTUtilities.setWindowOpacity(frame, .5f);を使って半透明化すると、フレームのタイトルバーや、子コンポーネントまで半透明化されるので、代わりに上記のサンプルでは以下のようにして半透明化を行っています。
-JFrame.setDefaultLookAndFeelDecorated(true);で、タイトルバーなどをJRootPaneに描画
-com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);でJFrameを完全に透明化
--1.7.0の場合は、代わりに、frame.setBackground(new Color(0,0,0,0));
-ContentPaneにsetBackground(new Color(.5f,.8f,.5f,.5f));で半透明の背景色を設定したパネルを追加

**参考リンク [#pc13cea7]
-[http://www.viva-edo.com/komon/edokomon.html 江戸の文様(和風素材・デスクトップ壁紙)]
-[http://java.sun.com/developer/technicalArticles/GUI/translucent_shaped_windows/ How to Create Translucent and Shaped Windows]

**コメント [#d57b3c09]
- そんな簡単にできるんですね!昔画面キャプチャしたり色々苦労した結果断念しました; -- [[riki]] &new{2010-06-14 (月) 22:57:11};
-- AWTUtilities.setWindowOpaqueなどが使えるようになったのは、6u10からですが、上記のサンプルみたいなことができるようになったのは、6u14から(多分[http://bugs.sun.com/view_bug.do?bug_id=6683775 Bug ID: 6683775 Painting artifacts is seen when panel is made setOpaque(false) for a translucent window])みたいですから、最近(ちょうど一年ぐらい)のようです。 -- [[aterai]] &new{2010-06-15 (火) 13:26:11};

#comment