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:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(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):
setVisible(true);
toFront();
requestFocus();
repaint();
...
public @Override void toFront() {
int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;
super.setExtendedState(sta);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);
}
Ab Java 8_20 scheint dieser Code einwandfrei zu funktionieren.