2009-11-20 10 views
7

Ich versuche, eine HUD-Stil-Anzeige für eine ausländische Anwendung zu erstellen.Wie erstelle ich ein Overlay-Fenster in Java?

Um dies zu tun, müsste ich ein transparentes Overlay-Fenster machen, das oben des Fensters der fremden Anwendung platziert werden würde. Das Überlagerungsfenster sollte es mir ermöglichen, Widgets zu platzieren und Text darauf zu zeichnen. Ereignisse sollten an das zugrunde liegende Fenster weitergeleitet werden, wenn sie im transparenten Bereich auftreten (und andernfalls erlauben, dass die Widgets wie erwartet funktionieren).

Ich mache das auf OSX mit Java. Ich würde hoffen, dies mit reinem Java mit Portabilität zu anderen Plattformen zu tun, aber wenn nicht möglich, würde ich mit Lösungen gut sein, die nur erlauben würde, dies auf OSX über Cocoa (Rococoa) oder Carbon zu tun.

+0

Haben Sie zufällig einen Screenshot von einer anderen App? – OscarRyz

Antwort

17

Eigentlich konnte ich das selbst herausfinden. Scheint einfacher zu sein als ich erwartet hatte:

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

nicht vergessen "frame.pack()"! – aeoliant

+0

Sie wissen, ob dies auch für Buttons funktioniert? I.e. wenn ich eine Art halbtransparenten Button über einer anderen Anwendung hätte, wo das Ereignis nicht an die zugrunde liegende Anwendung weitergeleitet wird, sondern an die Schaltfläche, damit ich sie drücken kann? – Peter

+1

Ich sehe die Textfelder nicht angezeigt. Irgendeine Idee warum das sein kann? – clankill3r