JavaFXで透過PNG画像を使う方法メモ。(Window用)
2008/11/26 EDIT: I RECCOMEND YOU INSTALL JAVA SE 6 UPDATE 10. FINALLY, WindowStyle.TRANSPARENT WORKS ON WINDOWS!!
JavaFXで透過のウィジェット作ろうとしても、Javaは標準で透過画像に対応していないらしい。
そんでもってWindowsは「アルファチャンネル?そ、そんなの知らないんだからねっ!!」って仕様の子のようで、色指定でアルファチャンネルつかっても透過できない。
つまりこんな感じの「箱」入りな後ろが白い子が出来ちゃうわけで。
ソース
import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.ImageIcon; var image = new ImageIcon("src/nekobean_normal.png"); var jframe = new JFrame(); jframe.add(new JLabel(image)); jframe.setName("Nekobean"); jframe.setLocation(300, 300); jframe.setSize(image.getIconWidth(), image.getIconHeight()); jframe.setVisible(true);
ねこび〜んをデスクトップ上でウロウロさせたい!、って思っても箱付きじゃあね…
そこでJNAのexamplesの中のWindowUtilsってのを使えば楽々できるようです。
JNAのホームページ
使うと透明部分の背景が透けて見えます。
ソース
import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.ImageIcon; var image = new ImageIcon("src/nekobean_normal.png"); var jframe = new JFrame(); jframe.add(new JLabel(image)); jframe.setName("Nekobean"); jframe.setLocation(300, 50); jframe.setSize(image.getIconWidth(), image.getIconHeight()); jframe.setUndecorated(true); jframe.setVisible(true); Transparent.set(jframe);
透過設定クラス(JavaFXのほうでやるとWindowの取り出しで配列が取れないって言われる… なぜじゃい?)
import com.sun.jna.examples.WindowUtils; import java.awt.Window; import javax.swing.JFrame; public class Transparent { public static void set(Window window) { if (!"true".equals(System.getProperty("sun.java2d.noddraw"))) System.setProperty("sun.java2d.noddraw", "true"); WindowUtils.setWindowTransparent(window, true); } public static void set(JFrame frame) { set(frame.getWindows()[0]); } }
追記:SwingFrameで動かない模様。もちっとチェックしてみます
さらに追記:SwingFrameがだめなんじゃなくて画像の描画がJFrameと違うからだめ(未確認)のようで、javax.swing.ImageIconをSwingFrame.getJFrameにaddしてあげればおk。フレームサイズで切れるけど、そこは設定で。
JavaFX Clock update, now with transparency(ネタ元。時計カッケー。)
Translucent Swing Windows on Mac OS X (去年の記事だけどMacだとJNAに修正が必要らしい。さすがにもう直ってるだろうけど。)
今回使用させていただいた画像。ja: ねこび〜ん (by カネウチカズコ is licensed under a Creative Commons 表示-継承 2.1 日本 License)
昨日は終電帰りだったのに始発で出社してみるテスト。
単純に生活バランスの崩壊。
眠くねってやばくね?