- PR -

Javaアプリの背景を透明にする方法は?

1
投稿者投稿内容
電気ひつじ
会議室デビュー日: 2003/01/15
投稿数: 8
投稿日時: 2003-07-23 15:11
JavaでGUIアプリケーションを作る際に背景を透明にしたいと考えています。

Windowsアプリでよくある常駐型のカレンダーを作りたいのでフレーム自体を
透明にして表示したい文字列だけが見えている状態にしたいのです。
SWINGでは無理だと思うのですがSWTなら可能でしょうか?
何か方法がありましたら、ご教授願います。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-07-23 22:08
透明というのがフレームやタイトルバーを表示させないという意味なら、
javax.swing.JWindow で良いと思います。
また、sdk 1.4.x からは javax.swing.JFrame (java.awt.Frame) の
setUndecorated() により装飾を非表示にできるはずです。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-07-24 01:04
こんにちは、櫻庭です。

引用:

電気ひつじさんの書き込み (2003-07-23 15:11) より:
JavaでGUIアプリケーションを作る際に背景を透明にしたいと考えています。

Windowsアプリでよくある常駐型のカレンダーを作りたいのでフレーム自体を
透明にして表示したい文字列だけが見えている状態にしたいのです。
SWINGでは無理だと思うのですがSWTなら可能でしょうか?
何か方法がありましたら、ご教授願います。



擬似的でいいのなら AWT でも Swing でもできないことはないです。
下の例は本当のサンプルなので、これを参考に考えてみてください。
ウィンドウの x, y と幅、高さの 4 つを引数にして実行すると、一見
透明風のウィンドウをつくります。

ただ、ダーティリジョンができても書き直してないので、キャプチャして
いるのがバレバレになってしまいます。

再キャプチャのボタンをクリックすれば、再キャプチャしますが...

同じテクニックを使えば、半透明のウィンドウなんてものも作れます。

コード:
import java.awt.AWTException;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;

public class TransFrame extends Frame {
    private Robot robot; 
    private BufferedImage backImage;
    private int x;
    private int y;
    private int width;
    private int height;

    public TransFrame(int x, int y, int width, int height) {
        setUndecorated(true);
        setBounds(x, y, width, height);
        setLayout(new FlowLayout());

        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;

        try {
            robot = new Robot();
        } catch (AWTException ex) {
            ex.printStackTrace();
            return;
        }


        Button recaptureButton = new Button("Recapture");
        recaptureButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    copyScreen();
                }
            });
        add(recaptureButton);

        Button closeButton = new Button("Close");
        closeButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    System.exit(0);
                }
            });

        add(closeButton);

        copyScreen();
    }

    public void paint(Graphics g) {
        g.drawImage(backImage, 0, 0, this);
    }

    private synchronized void copyScreen() {
            hide();
            try {
                Thread.sleep(100L);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }

            backImage = robot.createScreenCapture(new Rectangle(x, y, width, height));
            show();
    }

    public static void main(String[] args) {
        int x = Integer.parseInt(args[0]);
        int y = Integer.parseInt(args[1]);
        int width = Integer.parseInt(args[2]);
        int height = Integer.parseInt(args[3]);
        
        new TransFrame(x, y, width, height).setVisible(true);
    }
}




電気ひつじ
会議室デビュー日: 2003/01/15
投稿数: 8
投稿日時: 2003-07-25 06:20
Swing でも可能だったんですね。
しかもサンプルソースまで掲載していただいたので大変わかりやすかったです。
週末にでも、いろいろいじくってみたいと思います。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)