2012-07-06 125 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