9

Javaを使用して画面全体をカバーするフルスクリーンウィンドウを作成しようとしています。このウィンドウには、ある程度の透明度(約30%〜50%の透明度)も必要です。画面全体とは、すべて(OSX / Linux / Windowsのドック/タスクバー/メニューバーを含む)をカバーすることを意味します。透明性とは、ハッキングされたスクリーンショットだけでなく、リアルタイムの透明性を意味します。これが私が知っている/試したことです:

  • Java Fullscreen APIの使用:真のフルスクリーンを作成しますが、透明度を設定することはできません(不透明な色のみ)。1つのハックは、デスクトップ全体のスクリーンショットを撮り、それをウィンドウの背景として設定することですが、これはリアルタイムの透明性ではないことを意味します。
  • 画面のサイズに合わせてウィンドウサイズを設定する:画面全体に表示される間、特定のOS(Mac OS Xなど)では、ウィンドウはドック/メニューバーの上ではなく後ろにレンダリングされます。ただし、ここでは透明性が機能します。
  • setWindowOpacity APIの使用:2番目のケースでは機能しますが、最初のケースでは機能しません(フルスクリーンAPI)
  • アルファでのsetBackgroundの使用:setWindowOpacityと同様に機能しますが、特定のOSでのみ機能します。ただし、FullscreenAPIでは機能しません。
  • JFrame / JWindow / JDialog / Frame / Windowを使用する:運が悪かったので、できる限りすべてのウィンドウモデルを試しました

ですから、私が気付いていない別のハックによってこれが可能かどうかを尋ねています。それなら、喜んで聞いてみたいと思います。

目標は、半透明のフルスクリーンをデスクトップにオーバーレイすることです。

4

1 に答える 1

6
  • 表示されている TaskBar ei でのみ可能です

.

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
  • それ以外の場合は、例外があります

.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: 
The effects for full-screen windows are not supported. 

または、使用brutte_forceして PC をDirectX2 回フリーズし、PC の GPU を節約するために power_off のみを使用します。

import com.sun.awt.AWTUtilities;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JFrameOpacityExample {

    private JFrame myFrame = new JFrame("Test Frame");
    private boolean opacity = true;
    private boolean resize = true;
    private JButton button = new JButton("Opacity");
    private JButton button1 = new JButton("Resize");

    public JFrameOpacityExample() {
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                Object src = evt.getSource();
                if (opacity) {
                    AWTUtilities.setWindowOpacity(myFrame, 0.50f);
                    opacity = false;
                } else {
                    AWTUtilities.setWindowOpacity(myFrame, 1.0f);
                    opacity = true;
                }
            }
        });
        button1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                Object src = evt.getSource();
                if (resize) {
                    Rectangle dim = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
                    int h = dim.height;
                    int w = dim.width;
                    myFrame.setBounds(00, 00, w, h);
                    resize = false;
                } else {
                    myFrame.setBounds(100, 100, 400, 400);
                    resize = true;
                }
            }
        });
        JPanel panel = new JPanel();
        panel.add(button);
        panel.add(button1);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.add(panel);
        myFrame.setSize(400, 400);
        myFrame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                JFrameOpacityExample jFrameOpacityExample = new JFrameOpacityExample();
            }
        });
    }
}
于 2012-07-06T12:57:13.320 に答える