Wir haben eine Java-Anwendung, die in den Vordergrund gerückt werden muss, wenn ein Telekontrollmechanismus etwas in der Anwendung aktiviert.
Um dies zu erreichen, haben wir in der aufgerufenen Methode der Klasse, die den Rahmen unserer Anwendung darstellt (Erweiterung von a JFrame
), folgende Implementierung realisiert:
setVisible(true);
toFront();
Unter Windows XP funktioniert dies beim ersten Aufruf. Beim zweiten Mal blinkt nur die Registerkarte in der Taskleiste. Der Rahmen wird nicht mehr nach vorne verschoben. Gleiches gilt für Win2k. Unter Vista scheint es gut zu funktionieren.
Hast du eine Idee?
toFront()
das EDT mit aufzurufeninvokeLater
. Im Folgenden finden Sie eine einfache Antwort, die jedoch nicht akzeptiert wird. Es funktioniert jedoch. Perfekt.Antworten:
Eine mögliche Lösung ist:
quelle
Ich hatte das gleiche Problem damit
JFrame
, unter Ubuntu (Java 1.6.0_10) ein nach vorne zu bringen. Und der einzige Weg, wie ich es lösen könnte, ist die Bereitstellung einesWindowListener
. Insbesondere musste ich meine so einstellenJFrame
, dass sie immer auf dem neuesten StandtoFront()
ist, wenn sie aufgerufen wird, undwindowDeactivated
Event-Handler bereitstellensetAlwaysOnTop(false)
.Hier ist also der Code, der in eine Basis
JFrame
eingefügt werden kann, mit der alle Anwendungsrahmen abgeleitet werden.Wann immer Ihr Rahmen angezeigt oder zum Front Call gebracht werden soll
frame.setVisible(true)
.Seit ich zu Ubuntu 9.04 gewechselt bin, scheint es nicht nötig zu sein, ein
WindowListener
zum Aufrufen zu habensuper.setAlwaysOnTop(false)
- wie zu beobachten ist; Dieser Code wurde in die MethodentoFront()
und verschobensetVisible()
.Bitte beachten Sie, dass die Methode
setVisible()
bei EDT immer aufgerufen werden sollte.quelle
.setAlwaysOnTop(true);
war das einzige, das bei der Verwendung eines JWindow für mich funktioniert hat.setAlwaysOnTop(true)
Nur so kann ich es unter Windows 10 zum Laufen bringen - danke!Windows kann verhindern, dass Fenster den Fokus stehlen. Stattdessen blinkt das Taskleistensymbol. In XP ist es standardmäßig aktiviert (der einzige Ort, an dem ich Änderungen vorgenommen habe, ist die Verwendung von TweakUI, aber irgendwo gibt es eine Registrierungseinstellung). In Vista haben sie möglicherweise die Standardeinstellung geändert und / oder sie als vom Benutzer zugängliche Einstellung mit der sofort einsatzbereiten Benutzeroberfläche verfügbar gemacht.
Seit Windows 2K ist es eine Funktion, zu verhindern, dass sich Fenster nach vorne zwingen und den Fokus übernehmen (und ich bin dankbar dafür).
Trotzdem habe ich eine kleine Java-App, mit der ich mich daran erinnere, meine Aktivitäten während der Arbeit aufzuzeichnen, und die sich alle 30 Minuten zum aktiven Fenster macht (natürlich konfigurierbar). Es funktioniert unter Windows XP immer konsistent und blinkt nie im Fenster der Titelleiste. Es verwendet den folgenden Code, der im UI-Thread als Ergebnis eines Timer-Ereignisauslösens aufgerufen wird:
(Die erste Zeile wird wiederhergestellt, wenn sie minimiert wird ... tatsächlich würde sie wiederhergestellt, wenn sie ebenfalls maximiert wird, aber ich habe sie nie so).
Während ich diese App normalerweise minimiert habe, steht sie oft einfach hinter meinem Texteditor. Und wie gesagt, es funktioniert immer.
Ich habe eine Idee, was Ihr Problem sein könnte - vielleicht haben Sie eine Race-Bedingung mit dem Aufruf setVisible (). toFront () ist möglicherweise nur gültig, wenn das Fenster beim Aufruf tatsächlich angezeigt wird. Ich hatte dieses Problem schon einmal mit requestFocus (). Möglicherweise müssen Sie den Aufruf toFront () in einem UI-Listener für ein fensteraktiviertes Ereignis einfügen.
07.09.2014: Irgendwann funktionierte der obige Code nicht mehr, möglicherweise unter Java 6 oder 7. Nach einigen Untersuchungen und Experimenten musste ich den Code aktualisieren, um die
toFront
Methode des Fensters zu überschreiben. Führen Sie dies aus (in Verbindung mit geändertem Code von was befindet sich über):Ab Java 8_20 scheint dieser Code einwandfrei zu funktionieren.
quelle
super.setAlwaysOnTop(false);
ist so, dass das Fenster nicht immer oben ist, was notwendig ist, um das zu entfernen, wastrue
wir zuvor eingestellt haben, um das Fenster nach vorne zu bringen, richtig? Ich frage, weil mit Ihrem Code das Fenster in meinem Fall immer immer oben ist, was ich offensichtlich nicht will. Laufen jre1.8.0_66 unter Windows 10.Hier ist eine Methode, die WIRKLICH funktioniert (unter Windows Vista getestet): D.
Die Vollbildvariable gibt an, ob die App im Vollbildmodus oder im Fenster ausgeführt werden soll.
Dadurch blinkt die Taskleiste nicht, sondern das Fenster wird zuverlässig nach vorne gebracht.
quelle
Hj, alle Ihre Methoden funktionieren in Fedora KDE 14 nicht für mich. Ich habe eine schmutzige Möglichkeit, ein Fenster nach vorne zu bringen, während wir darauf warten, dass Oracle dieses Problem behebt.
Und das funktioniert perfekt in meinem Fedora KDE 14 :-)
quelle
Diese einfache Methode hat in Windows 7 perfekt funktioniert:
quelle
repaint()
ist nicht nötig, dasinvokeLater()
hat es geschafft. Danke dir.Ich habe deine Antworten getestet und nur die von Stefan Reich hat für mich gearbeitet. Obwohl ich es nicht geschafft habe, das Fenster in seinen vorherigen Zustand zurückzusetzen (maximiert / normal). Ich fand diese Mutation besser:
Das ist
setState
stattsetExtendedState
.quelle
Am einfachsten habe ich festgestellt, dass es keine plattformübergreifende Inkonsistenz gibt:
setVisible (false); setVisible (true);
quelle
Die Regeln, die festlegen, was passiert, wenn Sie .toFront () einen JFrame verwenden, sind in Windows und Linux identisch:
-> Wenn ein Fenster der vorhandenen Anwendung derzeit das fokussierte Fenster ist, wechselt der Fokus zum angeforderten Fenster. -> Wenn nicht, blinkt das Fenster lediglich in der Taskleiste
ABER :
-> Neue Fenster werden automatisch fokussiert
Also lasst uns das ausnutzen! Sie möchten ein Fenster nach vorne bringen, wie geht das? Gut :
Oder im Java-Code:
quelle
Im Javadoc gibt es zahlreiche Einschränkungen für die Methode toFront (), die möglicherweise Ihr Problem verursachen.
Aber ich werde trotzdem raten, wenn "nur die Registerkarte in der Taskleiste blinkt", wurde die Anwendung minimiert? In diesem Fall kann die folgende Zeile aus dem Javadoc zutreffen:
"Wenn dieses Fenster sichtbar ist, wird dieses Fenster nach vorne gebracht und möglicherweise zum fokussierten Fenster."
quelle
Um zu vermeiden, dass das Fenster den Fokus verliert, wenn es nach dem Ausblenden wieder sichtbar wird, ist Folgendes erforderlich:
Wie so:
quelle