Question

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 au premier plan, mais lorsque l'utilisateur clique sur la fenêtre IE, la boîte de dialogue est cachée derrière la fenêtre IE. Et puisque la boîte de dialogue est modale et contient tous les sous-fenêtres du volet IE, le volet IE ne s'actualise pas et la fenêtre de la boîte de dialogue est toujours peinte au-dessus d'IE (mais n'est pas actualisée). Ce comportement confond les utilisateurs (ils voient dans la boîte de dialogue située au-dessus d’IE, mais il semble qu’il a été suspendu car il n’est pas actualisé).

Il me faut donc 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 @shemnon l'a noté, je devrais créer une fenêtre au lieu de (parent, null, cadre, applet) du dialogue modal. Donc, le bon moyen d’initialiser le parent était:

parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet);
Était-ce utile?

La solution

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)

L'utilisation de getWindowAncestor ignorera les parents de l'applet (getRoot (composant) renverra des applets). Dans certaines versions de Java au moins, il existait un cadre équivalent à la fenêtre IE. YMMV.

Autres conseils

Créez un fil de fond qui appelle toFront dans la boîte de dialogue toutes les 2 secondes. Code que nous utilisons (j'espère avoir tout compris):

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;
}

Il s'agit d'une photo dans le noir, car je ne suis pas familier avec les applets, mais vous pouvez jeter un coup d'œil à la méthode window.showModalDialog intégrée à IE. C'est assez facile à utiliser. Peut-être une combinaison de ceci et de la suggestion de Noé?

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

Le code JavaScript dont vous auriez besoin serait quelque chose comme:

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

Et le Java serait:

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

Malheureusement, cela signifie qu’il faut renoncer à tout espoir d’avoir un joli modal. Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top