具有透明度的java全屏窗口

标签 java swing jframe transparency fullscreen

我正在尝试使用 Java 创建一个覆盖整个屏幕的全屏窗口。此窗口还必须具有一定的透明度(大约 30%-50% 的透明度)。当说整个屏幕时,我的意思是它涵盖了所有内容(包括 OSX/Linux/Windows 中的停靠栏/任务栏/菜单栏),而当我说透明度时,我的意思是实时透明度,而不仅仅是被黑的屏幕截图。这是我知道/尝试过的:

  • 使用 Java 全屏 API:虽然它创建了一个真正的全屏,但您不能使用它来实现某些透明度(只有不透明的颜色)。一种 hack 是截取整个桌面的屏幕截图并将其设置为窗口的背景,但这意味着它不是实时透明的。
  • 设置窗口大小以匹配屏幕尺寸:当它填满整个屏幕时,在某些操作系统(例如 Mac OS X)中,窗口将呈现在停靠栏/菜单栏后面,而不是上面。然而,透明度在这里确实起作用。
  • 使用 setWindowOpacity API:它适用于第二种情况,但不适用于第一种情况(全屏 API)
  • 将 setBackground 与 alpha 一起使用:它的工作方式类似于 setWindowOpacity,但仅适用于某些操作系统。但也不适用于全屏 API。
  • 使用 JFrame/JWindow/JDialog/Frame/Window:尽我所能尝试所有窗口模型,但没有任何运气

所以我想问一下这是否可以通过我不知道的另一个黑客来实现,那么我很乐意听到。

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

最佳答案

  • 只有在可见的 TaskBar e.i. 中才有可能

.

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
  • 否则你会遇到异常

.

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

或者通过使用 brutte_forceDirectX 两次卡住我的 PC,只有 power_off 来保存 PC 的 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();
            }
        });
    }
}

关于具有透明度的java全屏窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11362210/

相关文章:

自动调整大小和滚动的 Java JTextArea

java - 将两个 JToolBar 添加到边框布局中。

java - 通过事件处理插入图像?

java - CardLayout 不显示下一张卡

java - JFrame调整大小问题

java - java中读取输入的问题

java - 异步加载内容时闪烁

java - 尝试使用 joda-time/java 解析/格式化带有时区的日期

java - 为什么我的 Jlabels 或 Jpanels 没有显示?

java - 将本地 SOA 应用程序移出本地或迁移到云中