2010-06-16 12 views
10

Ich suche nach einer Lösung, um einen JFrame immer an der Spitze zu halten und mit immer ich meine wirklich immer.IMMER im oberen Fenster

setAlwaysOnTop(true); 

Dies wird nicht funktionieren, wenn ich ein Spiel im Vollbildmodus starte. Ich weiß, dass Sie normalerweise nicht wollen, dass Ihre Fenster oben bleiben, aber in diesem Fall ist es erforderlich.

+2

"immer an der Spitze und mit immer ich meine wirklich immer." Selbst wenn es zwei von ihnen gibt? –

+0

Nun, es wird nur eine Instanz dieser Anwendung ausgeführt. Mit immer wollte ich nur sagen, dass Fullscreen-Anwendungen wie Spiele dieses Fenster nicht verstecken sollten + das Vollbild-Fenster soll immer noch sichtbar sein (im Hintergrund) –

+0

In einem Multi-Fenster-System kann nur ein Fenster oben stehen Zeit (Highlander: Am Ende kann es nur einen geben). Eine Anfrage, immer an der Spitze zu sein, ist bestenfalls eine * Anfrage *, die nicht garantiert werden kann. Eine Vollbild-Anwendung hat immer die nächste Stufe erreicht - "Ich will immer ganz oben sein und die volle und exklusive Kontrolle über das Display haben" - es ist immer an erster Stelle und Sie haben immer die Nase vorn. –

Antwort

4

Dies ist nicht möglich.

Zum Beispiel, der Windows Task-Manager, auch wenn auf Immer oben gesetzt, wird von Vollbild-Anwendungen verdeckt werden.

Dies liegt daran, dass Vollbildanwendungen normalerweise einen anderen Grafikkontext verwenden und nicht überlagert werden können.

+0

Es gibt ein merkwürdiges Verhalten auf Windows 8 (wenn es darauf ankommt), dass Fenster sogar über Spielen sind, wenn sie immer oben sind (ich würde es eine Funktion nennen, aber keinen Fehler) –

2

Starten Sie einen anderen Prozess, um zu prüfen, ob das Fenster oben ist, andernfalls setzen Sie es oben.

+0

wie geht das? Kannst du mit einem Beispiel verlinken? – pinkpanther

1

Das klingt nach der Art von Frage, die Raymond Chen immer bei http://blogs.msdn.com/b/oldnewthing/ beantworten muss. Wie kannst du wirklich wirklich für immer und für wahr ein Fenster in den Vordergrund halten? Du kannst nicht. Denn was passiert, wenn jemand ELSEs Fenster den gleichen Trick benutzt, um sich immer und immer im Vordergrund zu halten? Welcher gewinnt?

0

Wenn Sie Vollbild wie in DirectX/OpenGL/was auch immer meinen, bin ich mir nicht sicher, dass Sie es wirklich abziehen können (oder sollten). Die meisten Betriebssysteme deaktivieren ihre native Fensterfunktion im Vollbildmodus, um die Renderleistung zu verbessern. Swing funktioniert über das native Windowing Toolkit.

Sie könnten etwas schreiben, das einen Timer verwendet und in kurzen Intervallen (z. B. 200ms) Ihr Fenster anweist, nach oben zu gehen. Abhängig von Ihrem Betriebssystem ist dies genau das, was Sie benötigen, oder eine schreckliche Ursache für Leistungsprobleme oder Flackern.

+1

Aye, die Timer-Idee würde auf jeden Fall schreckliches Flackern verursachen! – mcandre

1

Dies ist ein Beispielcode, der

public class AllWaysOnTop extends JFrame implements WindowListener { 

    AllWaysOnTop() { 
     // Code to setup your frame 
     addWindowListener(this); 
     // Code to show your frame 
    } 

    // The window event handlers. We use WindowDeactivated to 
    // try and keep the splash screen on top. Usually only keeps 
    // the splash screen on top of our own java windows. 
    public void windowOpened(WindowEvent event){}; 
    public void windowActivated(WindowEvent event){}; 
    public void windowDeactivated(WindowEvent event){ 
     toFront(); 
    } 
    public void windowIconified(WindowEvent event){}; 
    public void windowDeiconified(WindowEvent event){}; 
    public void windowClosed(WindowEvent event){}; 
    public void windowClosing(WindowEvent event) {}; 
} 

Referenz This forum post

+0

Dies funktioniert nicht, wenn eine andere App voll wird Bildschirm. –

+0

Wenn eine neue Anwendung im Vollbildmodus gestartet wird. Es sollte diesen Rahmen deaktivieren. Und bei Deaktivierung bringen wir es nach vorne. Sollte technisch funktionieren. Lass es mich versuchen. –

+0

Dann wird die Vollbild-App rausgeworfen und minimiert sich nicht? Ich denke, der OP sucht nach einer Möglichkeit, seine Fenster vor einer Vollbild-App anzuzeigen. –

0

Ich bin nicht sicher hilfreich sein sollte, aber ich würde wetten, dass auch die Vollbild-Fenster immer oben auf true eingestellt hat, und In diesem Fall bist du in den Bereich des undefinierten Verhaltens gestolpert. Im Allgemeinen, wenn zwei Fenster auf immer oben gesetzt sind, gibt es keine Garantie für die Bestellung. Ich denke im Allgemeinen, obwohl die Reihenfolge nur von der Reihenfolge abhängig ist, in der sie immer an der Spitze waren. In diesem Fall würde ich einfach warten, bis die App im Vollbildmodus läuft, um sie immer auf die oberste Ebene zu setzen und zu sehen, ob das funktioniert.

In anderen Fällen habe ich Leute gesehen, die Threads starten und dann den Fram gelegentlich auf immer oben setzen.

Alle diese Lösungen sind hässlich, also verwenden Sie einfach die, die Sie nachts schlafen lässt.

0

Ich weiß, dass dieser Beitrag alt ist, aber ich stieß auf dieses Problem und ich fand eine befriedigende Lösung. Mein Programm hat einige Benachrichtigungen, dass ich immer an der Spitze sein möchte, aber als ein Film im Vollbildmodus erschien, verschwanden sie. Glücklicherweise aktualisiert mein Programm diese Benachrichtigungen alle 5 Sekunden, und wenn ich setVisible (true) auf diesen JWindows anrufe, erhalten sie bei jedem Update die oberste Position wieder, wenn sie sie verloren haben.

-1

Ich wollte das gleiche wie OP, habe meine App im Vordergrund laufen, während mein Spiel lief.Es funktioniert nicht im Vollbildmodus, aber wenn du das Spiel in den Fenstermodus bringst und die Fenstereinstellungen an deinen Fernseher anpasst, funktioniert es. Ich brauchte nur das frame.setAlwaysOnTop, damit es funktioniert.

Verwandte Themen