Nous avons une application Java qui doit être mise au premier plan lorsqu'un mécanisme de télécommande active quelque chose dans l'application.
Pour obtenir cela, nous avons réalisé dans la méthode appelée de la classe qui représente le cadre de notre application (extension de a JFrame
) suite de l'implémentation:
setVisible(true);
toFront();
Sous Windows XP, cela fonctionne la première fois qu'il est appelé, la deuxième fois que seul l'onglet dans la barre des tâches clignote, le cadre ne vient plus au premier plan. Il en va de même pour Win2k. Sur Vista, cela semble fonctionner correctement.
As tu des idées?
toFront()
l'EDT en utilisantinvokeLater
. Il y a une réponse simple incluse ci-dessous, mais ce n'est pas la réponse acceptée. Cela fonctionne, cependant. À la perfection.Réponses:
Une solution possible est:
la source
J'ai eu le même problème en mettant un
JFrame
à l'avant sous Ubuntu (Java 1.6.0_10). Et la seule façon de résoudre ce problème est de fournir un fichierWindowListener
. Plus précisément, j'ai dû configurer myJFrame
pour qu'il reste toujours au top chaque fois qu'iltoFront()
est invoqué et fournirwindowDeactivated
un gestionnaire d'événements àsetAlwaysOnTop(false)
.Donc, voici le code qui pourrait être placé dans une base
JFrame
, qui est utilisée pour dériver tous les cadres d'application.Chaque fois que votre cadre doit être affiché ou mis au premier plan
frame.setVisible(true)
.Depuis que je suis passé à Ubuntu 9.04, il ne semble pas nécessaire d'avoir un
WindowListener
pour invoquersuper.setAlwaysOnTop(false)
- comme on peut l'observer; ce code a été déplacé vers les méthodestoFront()
etsetVisible()
.Veuillez noter que la méthode
setVisible()
doit toujours être invoquée sur EDT.la source
.setAlwaysOnTop(true);
était le seul qui a fonctionné pour moi lors de l' utilisation d' un JWindow.setAlwaysOnTop(true)
est le seul moyen de le faire fonctionner sous Windows 10 - merci!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:
(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):À partir de Java 8_20, ce code semble fonctionner correctement.
la source
super.setAlwaysOnTop(false);
c'est pour que la fenêtre ne soit pas toujours au-dessus, ce qui est nécessaire pour se débarrasser de ce quetrue
nous avons défini plus tôt pour amener la fenêtre à l'avant, n'est-ce pas ? Je demande parce qu'avec votre code, la fenêtre est toujours au top dans mon cas, ce que je ne veux évidemment pas. Exécution de jre1.8.0_66 sous Windows 10.Voici une méthode qui fonctionne VRAIMENT (testée sur Windows Vista): D
La variable plein écran indique si vous souhaitez que l'application s'exécute en plein écran ou en fenêtre.
Cela ne fait pas clignoter la barre des tâches, mais amène la fenêtre au premier plan de manière fiable.
la source
Hj, toutes les méthodes que vous possédez ne fonctionnent pas pour moi, dans Fedora KDE 14. J'ai une mauvaise façon de faire apparaître une fenêtre, pendant que nous attendons qu'Oracle corrige ce problème.
Et cela fonctionne parfaitement dans mon Fedora KDE 14 :-)
la source
Cette méthode simple a parfaitement fonctionné pour moi dans Windows 7:
la source
repaint()
n'est pas nécessaire, leinvokeLater()
fait. Je vous remercie.J'ai testé vos réponses et seule celle de Stefan Reich a fonctionné pour moi. Bien que je n'ai pas réussi à restaurer la fenêtre à son état précédent (maximisé / normal). J'ai trouvé cette mutation mieux:
C'est
setState
au lieu desetExtendedState
.la source
Le moyen le plus simple que j'ai trouvé qui n'a pas d'incohérence entre les plates-formes:
setVisible (faux); setVisible (vrai);
la source
Les règles régissant ce qui se passe lorsque vous .toFront () un JFrame sont les mêmes dans Windows et sous Linux:
-> si une fenêtre de l'application existante est actuellement la fenêtre focalisée, alors le focus passe à la fenêtre demandée -> sinon, la fenêtre clignote simplement dans la barre des tâches
MAIS :
-> les nouvelles fenêtres obtiennent automatiquement le focus
Alors exploitons ça! Vous souhaitez amener une fenêtre à l'avant, comment faire? Bien :
Ou, en code java:
la source
Il existe de nombreuses mises en garde dans le javadoc pour la méthode toFront () qui peuvent être à l'origine de votre problème.
Mais je vais quand même deviner, quand "seul l'onglet dans la barre des tâches clignote", l'application a-t-elle été minimisée? Si tel est le cas, la ligne suivante du javadoc peut s'appliquer:
"Si cette fenêtre est visible, amène cette fenêtre au premier plan et peut en faire la fenêtre focalisée."
la source
Pour éviter que la fenêtre ne perde le focus lorsqu'elle redevient visible après avoir été masquée, il suffit de:
Ainsi:
la source