Schlechte Welt

2008-02-20

[]Swingで透明、非矩形ウィンドウ 01:39

f:id:s_welt:20080221012952p:image


Adobe AIRで透明ウィンドウやら非矩形ウィンドウを作るのはすごい簡単で。

ん・ぱか工房さんのサンプルを見てもらえばそれがわかると思う。


そこで、それをJavaでやるにはどうすればいいのかと考えた。

初めに試したのはWiCoCoだけどこれはMacに対応しておらず断念。

次にSWTの方法を試してみると確かに簡単な非矩形のウィンドウは簡単に作れる、

でも画像から非矩形ウィンドウ作るのは大変そうだと思い断念。


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


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

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

frame.setUndecorated(true);

一行目で背景色を決めてるけどここが一番のポイントで、

色がARGB形式で指定できるのでここのアルファ値で透明度が指定できる。

今は0を指定しているので透明になるという。

二行目はタイトルバーを消すよっていう命令。これないとかっこ悪くなる。


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

ものすごい簡単。


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

探しきれてないだけかな。


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

動作画面

http://screencast.com/t/fNQyYWp47r2


ソース

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);
		}
	}
}

AlsAls 2008/03/21 23:33 大変参考になりました。ありがとうございます。
ただ、setBackgroundでアルファ値を指定可能なのは、ひょっとしてMac用のJavaだけではないでしょうか?

s_welts_welt 2008/03/27 12:17 お返事遅くなり申し訳ありません。
なんと!あれはMac用だけなんでしょうか。
近いうちにWindowsでもためしてみたいと思います!
情報ありがとうございました。

ひらひら 2008/06/30 17:42 マウスでの移動の処理(ソース)をおしえていただけませんか?

DensyakunDensyakun 2013/07/27 00:29 出来ない

hyakuhyaku 2017/09/08 22:43 setBackgroundとsetUndecoratedの順番を入れ替えるとWindowsでも動作しました。

Connection: close