2009-10-21 18 views
0

Mon application est un JApplet qui ouvre un JFrame. l'applet a un écouteur et un bouton, de sorte que si l'image passe derrière une autre fenêtre (perd la mise au point), l'utilisateur peut simplement cliquer sur le bouton pour l'amener au premier plan. frame.toFront(); Cela fonctionne bien.JFrame disparaît derrière la fenêtre du navigateur de l'applet

Mais d'abord (dans l'applet de public void init() {}), après avoir appelé frame.setVisible(true); j'appelle à frame.toFront(); pour vous assurer qu'il commence devant. Cependant, le cadre passe immédiatement derrière le navigateur. En appuyant sur le bouton l'appelle, cependant. J'ai essayé d'exécuter un thread séparé qui appelle à plusieurs reprises frame.toFront(); Mais dès que cela s'arrête, le cadre passe derrière le navigateur de toute façon. Ce n'est que lorsque le bouton est pressé qu'il vient à l'avant et reste devant. De plus, avoir une boucle ou un temps qui la maintient continuellement devant n'est pas une bonne option, parce que l'utilisateur peut avoir besoin ou vouloir le faire intentionnellement. Ce "bug" n'est pas présent sur le Mac (qui exécute Java 1.5), mais sur Windows (en cours d'exécution 1.6) - y compris IE, FF, Chrome, Safari, mais pas Opera (étrangement).

Cause possible et solution?

Répondre

0

Avez-vous essayé setAlwaysOnTop (true) sur le cadre? Je ne suis pas sûr cependant, si cela est autorisé sur les cadres ou les fenêtres créées à partir d'une applet.

+0

Non, ce n'est pas autorisé. –

0

Le setAlwaysOnTop(true) résout un problème, mais en crée un autre, à savoir qu'il n'y a plus aucun moyen pour l'utilisateur d'envoyer la fenêtre à l'arrière.

Mon sollution est un hack: Dans le WindowListener attaché à la JFrame, placez ce code:

@Override 
public void windowDeactivated(WindowEvent e) 
{ 
    if(firstToBack) //firstToBack is an bloolean instance variable initialized to true 
    { 
    final JFrame f = frame; 
    new Thread() { public void run() { 
     try { Thread.sleep(300); } catch(InterruptedException ie) {} 
     f.toFront(); 
    }}.start(); 
    firstToBack = false; 
    } 
} 

Cela commence essentiellement un nouveau fil première fois, qui attend un peu, puis appelle la JFrame à la de face. Il ne s'exécute qu'une seule fois, de sorte que le cadre ne revient pas toujours à l'avant chaque fois que l'utilisateur l'envoie à l'arrière. Les 300 millisecondes est une quantité arbitraire de temps et peut-être même pas nécessaire.

Peut-être que quelqu'un peut me dire pourquoi cela fonctionne, mais quand le même type de thread a été lancé par la méthode init() de l'applet, la fenêtre est allée à l'arrière, après la fin du thread?

Questions connexes