2012-07-06 72 views
8

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

  • 使用Java全屏API:虽然它创建一个真正的全屏,你不能有一些透明度(只有不透明的颜色)。一个窍门是截取整个桌面并将其设置为该窗口的背景,但这意味着它不是实时透明的。
  • 设置窗口大小以匹配屏幕尺寸:当它填满整个屏幕时,在某些操作系统(例如Mac OS X)中,窗口将呈现在扩展坞/菜单栏后面,而不是上面。然而,透明度在这里起作用。
  • 使用setWindowOpacity API:它在第二种情况下工作,而不是第一(全屏API)在
  • 使用的setBackground用α:它像setWindowOpacity工作,但仅在某些操作系统。但也不适用于Fullscreen API。
  • 使用的JFrame /的JWindow /的JDialog /帧/窗口:想尽窗口模式,我可以,没有任何的运气

所以我问这是否可能通过一个又一个黑客工具,我不知道的,然后我很乐意听到。

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

+0

我简要正在寻求在本周类似的东西。我曾希望创建一个彩色滤镜。鼠标点击需要击中过滤器后面的项目而不是过滤器。我没有太努力研究,所以如果有人知道那就太棒了! – mrswadge 2012-07-06 12:35:09

+1

@mrswadge:您可以将鼠标侦听器添加到您的窗口,然后在触发鼠标事件时(例如单击),切换窗口并使用java.awt.Robot来模拟事件(mousePress)。这解决了你的问题的一部分。让我们希望他们解决关于真正全屏/透明度的部分。 – ccit 2012-07-06 12:41:43

回答

6
  • 只有在可见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冻结我的电脑twicw,只有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(); 
      } 
     }); 
    } 
} 
+0

'com.sun.awt.AWTUtilities'这个例子是我见过的深入研究'com.sun'类的几个很好的理由之一。感谢分享! :) – 2012-07-06 15:48:50

+0

我已经做了类似于你放在一起的东西。您使用了'setWindowOpacity' API(点3),并指定屏幕大小以匹配屏幕分辨率(点2)。你可以使用'getDefaultToolkit()。getScreenSize()'动态调用'setWindowOpacity',但它仍然会在dock/menubar/...之后。另外'DirectX'不是跨平台的。您可以获得透明度或真实全屏,但不能同我正在寻求一种如问题中所解释的那样实现两者的方法。如果java可以做到这两个,那么他们为什么不实施/允许他们在一起。谢谢。 – ccit 2012-07-06 16:01:56

+0

不知道用OpenGL,那里找不到清晰的方法(不杀我的电脑),当然也许有人可以做到这一点,但我认为不适用于Windows平台,我希望我错了 – mKorbel 2012-07-06 16:08:48