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)