Windows ha la funzione di impedire alle finestre di rubare il focus; invece lampeggia l'icona sulla barra delle applicazioni. In XP è attivo per impostazione predefinita (l'unico posto che ho visto per cambiarlo è usare TweakUI, ma c'è un'impostazione del registro da qualche parte). In Vista potrebbero aver modificato l'impostazione predefinita e / o mostrata come un'impostazione accessibile all'utente con l'interfaccia utente predefinita.
Impedire alle finestre di forzarsi in primo piano e di concentrarsi è una funzionalità da Windows 2K (e io, per esempio, ne sono grato).
Detto questo, ho una piccola app Java che uso per ricordarmi di registrare le mie attività mentre lavoro, e si rende la finestra attiva ogni 30 minuti (configurabile, ovviamente). Funziona sempre in modo coerente con Windows XP e non lampeggia mai la finestra della barra del titolo. Utilizza il codice seguente, chiamato nel thread dell'interfaccia utente in seguito all'attivazione di un evento timer:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(la prima riga ripristina se minimizzata ... effettivamente la ripristinerebbe anche se ingrandita, ma non l'ho mai così).
Sebbene di solito questa app sia ridotta a icona, molto spesso è semplicemente dietro il mio editor di testo. E, come ho detto, funziona sempre.
Ho un'idea su quale potrebbe essere il tuo problema - forse hai una condizione di gara con la chiamata setVisible (). toFront () potrebbe non essere valido a meno che la finestra non sia effettivamente visualizzata quando viene chiamata; Ho già avuto questo problema con requestFocus (). Potrebbe essere necessario inserire la chiamata toFront () in un listener dell'interfaccia utente su un evento attivato dalla finestra.
07/09/2014: Ad un certo punto nel tempo il codice sopra ha smesso di funzionare, forse in Java 6 o 7. Dopo alcune indagini e sperimentazioni ho dovuto aggiornare il codice per sovrascrivere il toFront
metodo della finestra (insieme al codice modificato da cosa è sopra):
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);
}
A partire da Java 8_20, questo codice sembra funzionare correttamente.