Pergunta

Eu tenho que escrever um miniaplicativo que abra uma caixa de diálogo de senha.O problema é que a caixa de diálogo está configurada para estar sempre no topo, mas quando o usuário clica na janela do IE, a caixa de diálogo fica oculta atrás da janela do IE.E como o diálogo é modal e contém todos Threads do IE O painel do IE não é atualizado e a janela de diálogo ainda é pintada sobre o IE (mas não é atualizada).Este comportamento confunde os usuários (eles ver caixa de diálogo na parte superior do IE, mas parece que ele travou, pois não foi atualizado).

Então, preciso encontrar uma maneira de manter esse diálogo no topo de tudo.Mas qualquer outra solução para este problema seria boa.

Aqui está o código:

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

Resolução:Como @shemnon observou, eu deveria criar uma janela em vez de (null, Frame, Applet) pai da caixa de diálogo modal.Uma boa maneira de inicializar o pai foi:

parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet);
Foi útil?

Solução

Que argumento você está usando para o pai?

Você pode ter mais sorte se usar o pai do miniaplicativo.

javax.swing.SwingUtilities.getWindowAncestor(theApplet)

Usar getWindowAncestor ignorará os pais do miniaplicativo (getRoot(component) retornará miniaplicativos).Em pelo menos algumas versões do Java havia um Frame equivalente à janela do IE.YMMV.

Outras dicas

Faça um Thread em segundo plano que chame toFront na caixa de diálogo a cada 2 segundos.Código que usamos (espero ter entendido tudo):

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

Este é um tiro no escuro, pois não estou familiarizado com miniaplicativos, mas você pode dar uma olhada no método window.showModalDialog integrado do IE.É bastante fácil de usar.Talvez uma combinação disso com a sugestão de Noah?

Você pode tentar lançar um modal a partir de JavaScript usando a integração JavaScript (veja http://www.raditha.com/java/mayscript.php Por exemplo).

O JavaScript que você precisa seria algo como:

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

E o Java seria:

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

Infelizmente, isso significa desistir de toda esperança de ter um modal bonito.Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top