2008-09-16 20 views
2

Je dois écrire une applet qui ouvre une boîte de dialogue de mot de passe. Le problème est que la boîte de dialogue est configurée pour être toujours en haut, mais quand l'utilisateur clique sur la boîte de dialogue de la fenêtre IE est caché derrière la fenêtre IE néanmoins. Et puisque la boîte de dialogue est modale et contient tous les threads IE le volet IE ne pas actualise et la fenêtre de dialogue est toujours peinte sur IE (mais pas actualisé). Ce comportement déroute les utilisateurs (ils voient le dialogue sur IE mais il semble qu'il a pendu puisqu'il n'est pas actualisé).Les boîtes de dialogue modales dans IE sont cachées derrière IE si l'utilisateur clique sur le volet IE

J'ai donc besoin d'un moyen de garder ce dialogue au-dessus de tout. Mais toute autre solution à ce problème serait bien.

Voici le code:

 PassDialog dialog = new PassDialog(parent); 
     /* do some non gui related initialization */ 
     dialog.pack(); 
     dialog.setLocationRelativeTo(null); 
     dialog.setAlwaysOnTop(true); 
     dialog.setVisible(true); 

Résolution: Comme parent @shemnon noté que je devrais faire une fenêtre au lieu de (null, Frame, Applet) de dialogue modale. Donc, bonne façon de initlialize parent était:

parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet); 

Répondre

1

Quel argument utilisez-vous pour le parent?

Vous pouvez avoir plus de chance si vous utilisez le parent de l'applet.

javax.swing.SwingUtilities.getWindowAncestor(theApplet) 

Utilisation du getWindowAncestor sautera parents applet (getRoot (composants) retournera applets). Dans certaines versions de Java, il y avait un Frame équivalent à la fenêtre IE. YMMV.

+0

Eh bien, j'ai fait quelque chose comme JOptionPane.getRootFrame. Je vais regarder dans la première chose demain. –

+0

A travaillé - merci. –

0

Vous pouvez essayer de lancer un modal de JavaScript en utilisant l'intégration JavaScript (voir http://www.raditha.com/java/mayscript.php pour un exemple).

Le JavaScript que vous avez besoin serait quelque chose comme:

function getPassword() { 
    return prompt("Enter Password"); 
} 

Et Java serait:

password = jso.call("getPassword", new String[0]); 

Malheureusement, cela signifie renoncer à tout espoir d'avoir une belle recherche modale. Bonne chance!

1

Créer un fil d'arrière-plan qui appelle à Front sur le dialogue toutes les 2 secondes. code que nous utilisons (je l'espère, je suis tout):

class TestClass { 
protected void toFrontTimer(JFrame frame) { 
    try { 
     bringToFrontTimer = new java.util.Timer(); 
     bringToFrontTask = new BringToFrontTask(frame); 
     bringToFrontTimer.schedule(bringToFrontTask, 300, 300); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 
} 

class BringToFrontTask extends TimerTask { 
    private Frame frame; 
    public BringToFrontTask(Frame frame) { 
     this.frame = frame; 
    } 
    public void run() 
    { 
     if(count < 2) { 
      frame.toFront(); 
     } else { 
      cancel(); 
     } 
     count ++; 
    } 
    private int count = 0; 
} 

public void cleanup() { 
    if(bringToFrontTask != null) { 
     bringToFrontTask.cancel(); 
     bringToFrontTask = null; 
    } 
    if(bringToFrontTimer != null) { 
     bringToFrontTimer = null; 
    } 
} 

java.util.Timer bringToFrontTimer = null; 
java.util.TimerTask bringToFrontTask = null; 
} 
+0

C'est un peu à la force brute pour moi. Mais c'est le choix le plus facile. –

1

Ceci est un coup de feu dans l'obscurité que je ne suis pas familier avec les applets, mais vous pouvez jeter un oeil à intégré dans IE window.showModalDialog méthode. C'est assez facile à utiliser. Peut-être une combinaison de ceci et de la suggestion de Noé?