yuu_nkjm blog
2011-03-05(Sat) 編集
[Java][Swing] Javaで半透明表示をするときにはまったことのメモ
Javaで半透明表示をするときにはまったことのメモ.
塗りつぶし
背景色にアルファ値を設定して透過性を持たせた場合,描画を繰り返すとすると黒く塗りつぶされていってしまう.以下の様なコードを書くことで防げるそうだが,透過に透過を重ねている場合,これを全てに書くのは大変だし,意図通り動作するのか分からなかった..
JTableの背景色にアルファ値を設定して透過性を持たせた場合、デフォルトのBooleanRendererでは色が濃くなる(二重に描画される?)ので、paintComponentメソッドを以下のようにオーバーライドしています。
@Override protected void paintComponent(Graphics g) {
if(!isOpaque()) {
g.setColor(getBackground());
g.fillRect(0,0,getWidth(),getHeight());
}
super.paintComponent(g);
}
JScrollPane
JScrollPaneで透過をするには,JScrollPaneに貼り付けるコンポーネントだけでなく,ViewportのOpaqueの設定をを忘れずに.
scrollPane.getViewport().setOpaque(false)
JDesktopPaneやJFrame
ピクセル単位透過ウィンドウ
ピクセル透過は setWindowOpaque() の opaque に false を指定することで有効にする事が出来ます (この時点で完全な透明になります)。この機能が利用できるウィンドウの条件は以下の通りです。
- ピクセル単位透過をサポートするグラフィック構成を使用しているウィンドウ。つまりウィンドウに設定されている GraphicsConfiguration に対して isTranslucencyCapable() が true を返す必要があります。
- タイトルバーやウィンドウ境界を持たないウィンドウ。JFrame などを使用する場合は setUndecorated(true) でウィンドウ装飾を無効にしておく必要があります (このためウィンドウのクローズや移動は自分で実装する必要があります)。ピクセル透過が有効なウィンドウに対して undecorated に false を指定するとピクセル透過も無効になります。
- フルスクリーンでないウィンドウ。ピクセル透過を有効にしたウィンドウをフルスクリーンにしようとすると IllegalArgumentException が発生します。
ピクセル単位透過ウィンドウを使うにはsetUndecorated(true)をする必要がある.これは,JFrame.setDefaultLookAndFeelDecorated(true)を呼ぶことによっても呼べる.
透過とは直接関係ないが,JDesktopPaneのタイトルバーはJInternalFrameのタイトルバーな気がする.これもsetUndecorated(true)でオフに出来るのか?
AWTUtilitiesまとめ
単純透過ウィンドウピクセル単位透過ウィンドウ
Class com.sun.awt.AWTUtilities Method public static void setWindowOpacity(Window window, float opacity) throws UnsupportedOperationException; public static float getWindowOpacity(Window window);フルスクリーン画面 キオスク端末のような排他フルスクリーン画面を出す場合は GraphicsDevice の以下のメソッドを使用する。
Class com.sun.awt.AWTUtilities Method public static void setWindowOpaque(Window window, boolean opaque); public static boolean isWindowOpaque(Window window);フルスクリーンがサポートされていないプラットフォームではパフォーマンスが落ちる。 範囲が限られているなら try-catch で囲ったほうが安全性が高まる。 通常は setUndecorated() でウィンドウの装飾をオフにしておいたほうが良い。 通常はウィンドウをリサイズ不可にしておいたほうが良い。 アプレットからは権限を与えてやらないとフルスクリーンにはできない。
public boolean isFullScreenSupported() public void setFullScreenWindow(Window)