Swingで透明、非矩形ウィンドウ


Adobe AIRで透明ウィンドウやら非矩形ウィンドウを作るのはすごい簡単で。
ん・ぱか工房さんのサンプルを見てもらえばそれがわかると思う。


そこで、それをJavaでやるにはどうすればいいのかと考えた。
初めに試したのはWiCoCoだけどこれはMacに対応しておらず断念。
次にSWTの方法を試してみると確かに簡単な非矩形のウィンドウは簡単に作れる、
でも画像から非矩形ウィンドウ作るのは大変そうだと思い断念。


困ったなあと思ったらSwingでめちゃくちゃ簡単に実装できた!


やり方は簡単でポイントは次の二行。

frame.setBackground(new Color(0x00000000, true));
frame.setUndecorated(true);

一行目で背景色を決めてるけどここが一番のポイントで、
色がARGB形式で指定できるのでここのアルファ値で透明度が指定できる。
今は0を指定しているので透明になるという。
二行目はタイトルバーを消すよっていう命令。これないとかっこ悪くなる。


ウィンドウを透明にできたらあとは好きな物を配置するだけ。
ものすごい簡単。


でも検索してもSwingでのやり方が見当たらなかったのはなぜだろう。
探しきれてないだけかな。


というわけで以下動作画面とソース。。

ソース

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.imageio.ImageIO;

public class Java_test03 {
	public static void main(String args[]) {
		JFrame frame = new JFrame("TransparentFrame");
		frame.setSize(128, 128);
		frame.setLocation(576, 336);
		frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
		
		frame.setBackground(new Color(0x00000000, true));
		frame.setUndecorated(true);
		
		Canvas canvas = new Canvas();
		try {
			Image image = ImageIO.read(new File("kirby_t.png"));
			canvas.setImage(image);			
		} catch( Exception e ) {
			e.printStackTrace();
		}
		
		Container contentPane = frame.getContentPane();
		contentPane.add(canvas);
		
		frame.setVisible(true);
	}
	
	public static class Canvas extends JPanel {
		private Image image = null;
		
		public void setImage(Image image) {
			this.image = image;
		}
		
		public void paintComponent(Graphics g) {
			if( image == null ) return;
			g.drawImage(image, 0, 0, this);
		}
	}
}