我正在尝试使用 Java 创建一个覆盖整个屏幕的全屏窗口。这个窗口还必须有一定的透明度(大约30%-50%透明)。当我说整个屏幕时,我的意思是它覆盖了所有内容(包括 OSX/Linux/Windows 中的扩展坞/任务栏/菜单栏),当我说透明度时,我的意思是实时透明度,而不仅仅是被黑的屏幕截图。这是我所知道/尝试过的:
- 使用 Java Fullscreen API:虽然它创建了真正的全屏,但您不能使用它具有一定的透明度(只能是不透明的颜色)。一种技巧是截取整个桌面的屏幕截图并将其设置为窗口背景,但这意味着它不是实时透明的。
- 设置窗口大小以匹配屏幕尺寸:虽然它填充整个屏幕,但在某些操作系统(例如 Mac OS X)中,窗口将呈现在停靠栏/菜单栏后面,而不是其上方。然而,透明度在这里确实发挥作用。
- 使用 setWindowOpacity API:它适用于第二种情况,但不适用于第一种情况(全屏 API)
- 将 setBackground 与 alpha 一起使用:它的工作方式类似于 setWindowOpacity,但仅在某些操作系统中。但也不适用于全屏 API。
- 使用 JFrame/JWindow/JDialog/Frame/Window:尝试了我可以的所有窗口模型,但没有任何运气
所以我问这是否可以通过另一个我不知道的黑客来实现,那么我会很高兴听到。
目标是在桌面上覆盖半透明的全屏。
.
GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
.
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException:
The effects for full-screen windows are not supported.
或通过使用brutte_force
to DirectX
我的电脑冻结两次,仅关闭电源以节省电脑的 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();
}
});
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)