Windows a la possibilité d'empêcher les fenêtres de voler le focus; à la place, il fait clignoter l'icône de la barre des tâches. Dans XP, il est activé par défaut (le seul endroit où j'ai vu le changer est d'utiliser TweakUI, mais il y a un paramètre de registre quelque part). Dans Vista, ils peuvent avoir modifié la valeur par défaut et / ou l'ont exposée en tant que paramètre accessible à l'utilisateur avec l'interface utilisateur prête à l'emploi.
Empêcher les fenêtres de se forcer à l'avant et de se concentrer est une fonctionnalité depuis Windows 2K (et je suis, pour ma part, reconnaissant pour cela).
Cela dit, j'ai une petite application Java que j'utilise pour me rappeler d'enregistrer mes activités pendant que je travaille, et elle se fait la fenêtre active toutes les 30 minutes (configurable, bien sûr). Il fonctionne toujours de manière cohérente sous Windows XP et ne fait jamais clignoter la fenêtre de la barre de titre. Il utilise le code suivant, appelé dans le thread d'interface utilisateur à la suite du déclenchement d'un événement de minuterie:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(la première ligne restaure si minimisée ... en fait, elle la restaurera si elle est maximisée aussi, mais je ne l'ai jamais fait).
Bien que cette application soit généralement réduite au minimum, elle est souvent simplement derrière mon éditeur de texte. Et, comme je l'ai dit, cela fonctionne toujours.
J'ai une idée de ce que pourrait être votre problème - peut-être avez-vous une condition de concurrence avec l'appel setVisible (). toFront () peut ne pas être valide à moins que la fenêtre ne soit réellement affichée lorsqu'elle est appelée; J'ai déjà eu ce problème avec requestFocus (). Vous devrez peut-être placer l'appel toFront () dans un écouteur d'interface utilisateur sur un événement activé par la fenêtre.
2014-09-07: À un moment donné, le code ci-dessus a cessé de fonctionner, peut-être à Java 6 ou 7. Après quelques recherches et expérimentations, j'ai dû mettre à jour le code pour remplacer la toFront
méthode de la fenêtre (en conjonction avec le code modifié de ce est au-dessus):
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);
}
À partir de Java 8_20, ce code semble fonctionner correctement.