プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

JAVAで透明ウィンドウ

Java7でやり方が変わりました。記事

この記事はJRE1.6での内容になります。






知らなかった。JAVAのJFrameは半透明にならないってずっと思っていたよ。


上の図はJDialog(を拡張したクラス)を半透明で表示したところです。

シンプルだけど格好よくね?
ただ、Windowsで起動すると途端にださくなりますが



こんな感じ


JDialog d = new JDialog();
d.setUndecorated(true);//下のsetWindowOpaqueはウィンドウ装飾をなくしておかないとエラーになる。
AWTUtilities.setWindowOpaque(d, false);
JPanel p = new JPanel();
d.add(p);
p.setBackground(new Color(0xa0000000,true));//ちょっと透明な黒色に背景を設定
これで、ウィンドウの背景が透明になる。


ウィンドウ全部を半透明にしたいときは

AWTUtilities.setWindowOpacity(d, 0.5f);
とすると、全体が半透明になる。

半透明に出来るのは08年ぐらいからで割と最近になってかららしく、古いJAVAVM使っている人は動かない。

How to Create Translucent and Shaped Windowsに書いてあったことをやったみただけなので、基本的なことはこれ読んでくれい。
あと、非矩形ウィンドウの作り方も載っています。


ただ、試した限りではWindowsとMacでの挙動に差があったので両方でのデバッグが必要。Write Once, Run Anywhereの精神なんて気にするな。

あと、上の図ではJTextFieldが載っかってるけど、Macではこれで何ともないのだが、Windows環境下では、何故か全角文字を入力すると表示がバグる。

仕様がないので、JTextFieldにInputMethodListenerをつけて、ウィンドウをrepaint()させることで何とか表示がバグるのを防いだ。