java全屏透明窗口

java全屏透明窗口,java,swing,jframe,transparency,fullscreen,Java,Swing,Jframe,Transparency,Fullscreen,我正在尝试使用Java创建一个覆盖整个屏幕的全屏窗口。此窗口还必须具有一定的透明度(大约30%-50%的透明度)。当我说全屏幕时,我的意思是它涵盖了一切(包括OSX/Linux/Windows中的dock/taskbar/menubar),当我说Transparency时,我指的是实时Transparency,而不仅仅是黑客截图。以下是我所知道/尝试过的: 使用Java全屏API:虽然它创建了一个真正的全屏,但它不能有一定的透明度(只有不透明的颜色)。一种方法是截取整个桌面的屏幕,并将其设置为

我正在尝试使用Java创建一个覆盖整个屏幕的全屏窗口。此窗口还必须具有一定的透明度(大约30%-50%的透明度)。当我说全屏幕时,我的意思是它涵盖了一切(包括OSX/Linux/Windows中的dock/taskbar/menubar),当我说Transparency时,我指的是实时Transparency,而不仅仅是黑客截图。以下是我所知道/尝试过的:

  • 使用Java全屏API:虽然它创建了一个真正的全屏,但它不能有一定的透明度(只有不透明的颜色)。一种方法是截取整个桌面的屏幕,并将其设置为窗口的背景,但这意味着它不是实时透明的
  • 设置窗口大小以匹配屏幕尺寸:当窗口填充整个屏幕时,在某些操作系统(例如Mac OS X)中,窗口将呈现在dock/menubar后面,而不是上方。然而,透明度在这里确实起作用
  • 使用setWindowOpacity API:它适用于第二种情况,但不适用于第一种情况(全屏API)
  • 将setBackground与alpha一起使用:它与setWindowOpacity类似,但仅在某些操作系统中使用。但也不适用于全屏API
  • 使用JFrame/JWindow/JDialog/Frame/Window:尝试了我能尝试的所有窗口模型,但没有任何运气
所以我想问,这是否可能通过另一个我不知道的黑客,然后我会很高兴听到

目标是在桌面上覆盖一个半透明的全屏。

  • 只能通过可视任务栏e.i

  • 否则你会得到一个例外

或者使用
brutte\u force
DirectX
冻结我的电脑twicw,只需关闭电源即可保存电脑的GPU

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

本周我曾短暂地追求过类似的东西。我希望创造一个彩色滤光片。鼠标点击需要点击过滤器后面的项目,而不是过滤器。我没有太努力地研究,所以如果有人知道,那就太好了@mrswadge:您可以将鼠标侦听器添加到窗口中,然后在触发鼠标事件时(例如单击),切换窗口,并使用java.awt.Robot模拟事件(mousePress)。这可以解决你的部分问题。希望他们能解决真正的全屏/透明问题。
com.sun.awt.AWTUtilities
这个例子是我看到的钻研
com.sun
类的少数几个好理由之一。谢谢分享!:)我已经做了一些类似于你所做的事情。您使用了
setWindowOpacity
API(第3点)以及指定屏幕大小以匹配屏幕分辨率(第2点)。您可以使用
getDefaultToolkit().getScreenSize()
并动态调用
setWindowOpacity
使其适合整个屏幕,但它仍将位于dock/menubar/…等后面。此外,
DirectX
也不是跨平台的。您可以获得透明或真正的全屏,但不能同时获得两者。正如问题中所解释的,我正在寻求一种实现这两个目标的方法。如果java可以同时实现这两个功能,那么为什么它们不一起实现/允许它们呢。谢谢。不确定OpenGL,在那里我找不到明确的方法(不杀死我的电脑),当然可能有人可以这样做,但我认为Windows平台不可用,我希望我错了,或者如果有人为Oracle工作,或者API板的一部分,也许他们可以允许这样的事情(因为这是可能的)。这可能是对UI实施良好实践的可用性限制。
myFrame.setUndercorated(true);/*需要在myFrame.setSize*/
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: 
The effects for full-screen windows are not supported. 
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();
            }
        });
    }
}