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