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)
- http://b.hatena.ne.jp/otsune/favorite.rss ×1
- http://b.hatena.ne.jp/yasutakasato/favorite.rss ×1
- http://b.hatena.ne.jp/pkb/favorite?mode=rss ×1
- http://b.hatena.ne.jp/lapis25/favorite?mode=rss ×1
- https://www.google.co.jp/ ×733
- https://www.google.com/ ×25
- https://www.google.co.jp/ ×14
- https://www.bing.com/ ×10
- http://search.yahoo.co.jp/ ×4
- https://www.google.co.uk/ ×3
- http://b.hatena.ne.jp/tarchan/java/swing/ ×2
- https://www.google.ca/ ×2
- http://search.babylon.com/?q=Java pixelに透明を設定&s=we... ×2
- http://search.babylon.com/?q=Java 背景色を透明にする&s=web&... ×1
- http://search.babylon.com/?s=web&babsrc=home&rlz=0... ×1
- http://www.unisearch.jp/type/web/page/1/?area=web-... ×1
- http://search.babylon.com/?q=java 半透明 fillRect&s=w... ×1
- http://b.hatena.ne.jp/t/SWING?sort=eid ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- https://www.google.co.jp/url?gcjeid=15 ×1
- http://search.babylon.com/?q=java 半透明塗りつぶし&babsrc=... ×1
- http://search.fenrir-inc.com/?q=java setWindowOpaq... ×1
- http://www.search.ask.com/web?q=java swing 投下&apn_... ×1
- https://www.google.co.jp/url ×1
- http://search.fenrir-inc.com/?q=Java 7 透明&hl=ja&sa... ×1
- http://websearch.excite.co.jp/?q=java 透過&look=exci... ×1
- http://search.fenrir-inc.com/?q=JFrame 透明&hl=ja&sa... ×1
- http://search.fenrir-inc.com/?q=java 半透明&hl=ja&saf... ×1
- http://search.smt.docomo.ne.jp/result?search_box=j... ×1
- http://b.hatena.ne.jp/t/java?sort=eid ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?q=透明 フルスクリーン ウィンドウ&h... ×1
- http://search.smt.docomo.ne.jp/result?search_box=背... ×1
- https://www.google.com/webhp?hl=ja ×1
- https://www.google.com.tw/ ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- AWTUtilities applet ×65 / java 半透明 ×25 / java 透過 ×7 / Java 全画面 KIOSK ×5 / JScrollPane 背景色 挙動 ×4 / java 透明 濃くなる awt ×3 / Java 半透明 ×3 / java パネル 半透明 ×3 / java 透過 二重 ×2 / java rgb 半透明 paintcomponent ×2 / java 透明度 ×2 / 言語バーの半透明の色を濃くしたい とは ×2 / JFrame 背景 透明化 無効 ×2 / panel java 透過 ×2 / Jframe ウィンドウ透明 ×2 / JInternalFrame タイトルバー 背景色 ×2 / swing コンポーネント 半透明化 処理 ×2 / java 透明 textarea ×2 / swing 透明ウィンドウ ×2 / JFRAME 透過 ×2 / java 半透明化 ×2 / java 半透明 塗りつぶし ×2 / java ウィンドウ アルファ値 ×2 / Jpanel 半透明 ×2 / setWindowOpaque ×2 / undecorated java ×1 / android setwindowopaque ×1 / java 透過 背景 jframe ×1 / java ウィンドウ透明 ×1 / 半透明 java ×1 / JDesktopPane 透明 ×1 / java swing setWindowOpaque ×1 / java 背景 半透明 ×1 / android setWindowOpaque ×1 / Java タイトルバー 透過 ×1 / AWTUtilities setWindowOpaque linux ×1 / AWTUtilities ×1 / java 指定長の空白 ×1 / java swing jtable html 背景色 ×1 / JFrame Graphics2D 半透明 フレーム ×1 / Java Swing 半透明 ×1 / java 透明 濃くなる ×1 / java jpanel 半透明 ×1 / com.sun.awt.AWTUtilities ×1 / java アプレット サンプル ×1 / せUndecorated ×1 / java JInternalFrame タイトルバー 背景色 ×1 / java paintComponent 透過度 ×1 / java jpanel 透過 ×1 / AWTUtilities eqlipse ×1 / java setUndecorated 移動 ×1 / ウィンドウ背景透明 hta ×1 / openSUSE 透明 ×1 / java refrection ×1 / java JDialog setUndecorated ×1 / java Jtable 透過 ×1 / AWTUtilities setWindowOpaque ×1 / JAVA color 透明 ×1 / Swing Java 半透明 ×1 / eclipse AWTUtilities ×1 / Boolean 背景色 java ×1 / jtable 透明 ×1 / android java 透過 ×1 / windows7 swing 背景色 ×1 / jtable 背景色 変更 数値 ×1 / android フルスクリーン 透過 ×1 / uwsc java scroll panel viewport ×1 / 漫画 ×1 / Java swing 半透明 ×1 / グレースケール ×1 / 透過 Java ×1 / java JscrollPane 透過 ×1 / jtable 行毎 列数 変える ×1 / JPanel.setOpaque(false) ×1 / swing java table 色変更 ×1 / setUndecorated internalframe ×1 / getviewport opaque ×1 / joomla java ウインドウ ×1 / applet Jtable 背景色 ×1 / java JTable 選択状態色 半透明 ×1 / jframe フルスクリーン 透過 ×1 / メモ表示 java ×1 / java 画面 半透明化 ×1 / jscrollpane 動かない ×1 / java 塗りつぶし 半透明 ×1 / java 背景 透過 二重 ×1 / java JInternalFrame タイトルバーの色 ×1 / setUndecorated ×1 / java ウインドウ 半透明 ×1 / java swing 透明 ×1 / Java 塗りつぶし 半透明 ×1 / java swing 透過 ×1 / java swing 半透明 AWTUtilities ×1 / java jframe 半透明 ×1 / isFullScreenSupported ×1 / java コンポーネント 透過 ×1 / java 半透明表示 ×1 / getViewport().setOpaque ×1 / JFrame 透明 ×1 / java paintComponent 透過 ×1