2009-11-20 46 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