2009-11-20 61 views
7

我正在嘗試爲外國應用程序創建HUD樣式顯示。如何在Java中創建覆蓋窗口?

要做到這一點,我需要做一個透明的覆蓋窗口,這將放置在國外應用程序的窗口頂部 。疊加窗口應允許我放置小部件並在其上繪製文本。事件應該被轉發到底層窗口,如果它們發生在透明區域(否則允許小部件預期工作爲 ),則返回 。

我正在使用Java在OSX上執行此操作。我希望可以用純Java來完成這個任務,並且可以移植到其他平臺,但是如果不行的話,我會很好的解決方案,只允許我通過Cocoa(Rococoa)或Carbon在OSX上執行此操作。

+0

你碰巧從其他應用程序截圖? – OscarRyz 2009-11-20 03:14:44

回答

17

其實,我能夠自己弄清楚這一點。似乎比我預期的更容易:

public class Overlay { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Transparent Window"); 
     frame.setUndecorated(true); 
     frame.setBackground(new Color(0, 0, 0, 0)); 
     frame.setAlwaysOnTop(true); 
     // Without this, the window is draggable from any non transparent 
     // point, including points inside textboxes. 
     frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", false); 

     frame.getContentPane().setLayout(new java.awt.BorderLayout()); 
     frame.getContentPane().add(new JTextField("text field north"), java.awt.BorderLayout.NORTH); 
     frame.getContentPane().add(new JTextField("text field south"), java.awt.BorderLayout.SOUTH); 
     frame.setVisible(true); 
     frame.pack(); 
    } 
} 
+3

不要忘記「frame.pack()」! – aeoliant 2013-01-16 15:27:08

+0

你知道這是否也適用於按鈕?即如果我不想在另一個應用程序的頂部安裝某種半透明的按鈕,那麼事件不會轉發到底層應用程序,而是轉發到按鈕,因此我可以按它? – Peter 2014-06-05 08:48:08

+1

我看不到出現的文本字段。任何想法,爲什麼這可能是? – clankill3r 2014-12-24 10:55:57