97 votes

Comment faire pour mettre une fenêtre à l’avant ?

Nous avons une Java de l'application qui doit être apporté à l'avant-plan lors de l'une de téléconduite mécanisme active quelque chose dans la demande.

Afin d'obtenir ce que nous avons réalisé dans le appelé la méthode de la Classe qui représente le Cadre de notre application (extension d'une JFrame) à la suite de la mise en œuvre:

setVisible(true);
toFront();

Sous Windows XP cela fonctionne, la première fois qu'il est convoqué, dans un deuxième temps seulement l'onglet dans la barre des tâches clignote, le cadre n'a pas de venir à l'avant plus. En va de même pour Win2k. Sur Vista, il semble bien fonctionner.

Quiconque idées?

38voto

01es Points 2891

J'ai eu le même problème avec le saumurage un châssis à l'avant sous Ubuntu (Java 1.6.0_10). Et la seule façon que je pouvais le résoudre est de fournir une fenêtre pour l'auditeur. Plus précisément, j'ai dû mettre de cadre pour toujours rester au top à chaque fois que toFront est invoqué, et de fournir windowDeactivated gestionnaire d'événement pour setAlwaysOnTop(false).


Alors, voici le code qui peut être placé dans un cadre de base, qui est utilisé pour dériver application tous les cadres.

@Override
public void setVisible(final boolean visible) {
  // make sure that frame is marked as not disposed if it is asked to be visible
  if (visible) {
      setDisposed(false);
  }
  // let's handle visibility...
  if (!visible || !isVisible()) { // have to check this condition simply because super.setVisible(true) invokes toFront if frame was already visible
      super.setVisible(visible);
  }
  // ...and bring frame to the front.. in a strange and weird way
  if (visible) {
      int state = super.getExtendedState();
      state &= ~JFrame.ICONIFIED;
      super.setExtendedState(state);
      super.setAlwaysOnTop(true);
      super.toFront();
      super.requestFocus();
      super.setAlwaysOnTop(false);
  }
}

@Override
public void toFront() {
  super.setVisible(true);
  int state = super.getExtendedState();
  state &= ~JFrame.ICONIFIED;
  super.setExtendedState(state);
  super.setAlwaysOnTop(true);
  super.toFront();
  super.requestFocus();
  super.setAlwaysOnTop(false);
}

Chaque image doit être affichée ou mise à l'avant d'appeler cadre.setVisible(true).

Depuis que j'ai déménagé à Ubuntu 9.04 il semble y avoir aucun besoin d'en avoir une fenêtre de l'auditeur pour l'invocation de super.setAlwaysOnTop(false) -- que l'on peut observer ce code a été déplacé vers des méthodes toFront et setVisible.

Veuillez noter que la méthode setVisible doit toujours être invoquée sur l'EDT.

23voto

Lawrence Dol Points 27976

Windows a de la facilité pour empêcher windows de voler; au lieu de cela, il affiche l'icône de la barre. Sous XP c'est sur par défaut (le seul endroit où j'ai vu pour la modifier à l'aide de TweakUI, mais il y a un paramètre de registre quelque part). Dans Vista, ils ont peut-être changé la valeur par défaut et/ou exposés en tant qu'utilisateur accessible avec le paramètre out-of-the-box de l'INTERFACE utilisateur.

La prévention de windows à partir de forcer eux-mêmes à l'avant et à la prise de focus est une fonctionnalité depuis Windows 2K (et j'en suis heureux pour elle).

EDIT: cela dit, j'ai un peu de Java app que j'utilise pour me rappeler de mes activités pendant le travail, et il fait lui-même la fenêtre active toutes les 30 minutes (configurable, bien sûr). Il fonctionne toujours de manière cohérente sous Windows XP et jamais clignote dans la barre de titre de la fenêtre. Il utilise le code suivant, appelé dans le thread de l'INTERFACE utilisateur en tant que résultat d'un événement de minuterie de cuisson:

if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();

(la première ligne restaure si réduite... en fait, il serait de les restaurer en cas de maximisée trop, mais je n'ai jamais ainsi).

Alors que j'ai l'habitude de cette application réduit, assez souvent, c'est simplement derrière mon éditeur de texte. Et, comme je l'ai dit, il fonctionne toujours.

EDIT2: j'ai une idée sur ce que votre problème pourrait être - peut-être que vous avez une condition de concurrence avec le setVisible (). toFront() ne peut être valable que si la fenêtre est en fait affiché lorsqu'il est appelé; j'ai eu ce problème avec requestFocus() avant. Vous devrez peut-être mettre la toFront() l'appel à une INTERFACE d'écoute sur une fenêtre de l'événement activé.

12voto

Stefan Reich Points 71

Voici une méthode qui fonctionne vraiment (testé sur Windows Vista) :D

La variable fullscreen indique si vous souhaitez que l’application à exécuter plein écran ou fenêtré.

Cela ne clignote pas la barre des tâches, mais mettre la fenêtre à l’avant de manière fiable.

4voto

Mr Ed Points 2068

Cette méthode simple a parfaitement fonctionnée pour moi sous Windows 7 :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X