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);
ピクセル単位透過ウィンドウ
Class	 com.sun.awt.AWTUtilities
Method	 public static void setWindowOpaque(Window window, boolean opaque);
public static boolean isWindowOpaque(Window window);
フルスクリーン画面 キオスク端末のような排他フルスクリーン画面を出す場合は GraphicsDevice の以下のメソッドを使用する。
public boolean isFullScreenSupported()
public void setFullScreenWindow(Window)
フルスクリーンがサポートされていないプラットフォームではパフォーマンスが落ちる。 範囲が限られているなら try-catch で囲ったほうが安全性が高まる。 通常は setUndecorated() でウィンドウの装飾をオフにしておいたほうが良い。 通常はウィンドウをリサイズ不可にしておいたほうが良い。 アプレットからは権限を与えてやらないとフルスクリーンにはできない。
本日のリンク元
アンテナ
その他のリンク元
検索

トップ «前の日記(2011-02-20(Sun)) 最新 次の日記(2011-03-06(Sun))» 月表示 編集 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|