Problema com JDialog/refresh da janela

3 respostas
C

Pessoal,

estou tendo uma dificuldade ao fazer um JDialog com componentes que são adicionados e alterados
dinamicamente. O meu código precisa ficar “ouvindo” um componente e ir montando a tela conforme for necessário.

O problema é que a não consigo fazer o refresh da janela. Ela parece que fica travada durante o processamento, exibindo tudo
somente no final. Eu escrevi um código que simula o problema. Se alguém puder apontar o que está faltando…

Note que o while simula um processamento. Este while não pode ficar em uma nova thread. (Use o JniWrapper para ler uma dll, mas não funciona em outra thread).

Obrigado

// Trecho de codigo para simular o problema do "refresh"
        JDialog jDialog = new JDialog();
        jDialog.setSize(250,250);
        jDialog.setAlwaysOnTop(true);
        jDialog.setLocationRelativeTo(null);
        jDialog.setVisible(true);    
        //
        // Neste ponto deveria ser visto a janela wm branco
        // Nem com o repaint funciona corretamente
        //
        jDialog.repaint(); // aqui precisaria fazer um "refresh" da tela. Nao funciona
        jDialog.validate(); // e nem assim
        //
        JLabel lblStatus = new JLabel();
        jDialog.add(lblStatus);
        lblStatus.setText("Aguarde");
        lblStatus.validate(); // aqui precisaria fazer um "refresh" da tela. Nao funciona
        lblStatus.repaint(); // e nem assim
        jDialog.repaint();  // e nem assim
        jDialog.validate(); // e nem assim        
        //
        // Aqui deveria mostrar o label "aguarde" enquanto o processamento é executado
        // Mas nao mostra nada, porque o "refresh" da tela nao foi executado

3 Respostas

fabim

Faça em uma thread separada.

Procure aqui no forum por “JProgressBar”.

ViniGodoy

Enquanto o evento estiver sendo processado na thread do Swing, nenhum evento de repaint será processado.

Por um motivo básico, imagine esse pseudocódigo da thread do Swing:

public class ThreadDoSwing() extends Thread
   public void run() {
      while (true) {
         Event evt = EventQueue.popEvent();
         evt.run(); 
    }
}

Notou o problema? O primeiro evento que sairia é o seu. Cada repaint() e validate() que você chama, empilha outro evento na EventQueue da awt… mas quando a eventqueue vai ser lida? Apenas quando seu evento terminar… A grosso modo, é assim que a coisa funciona…

Para resolver isso, você PRECISA liberar a Thread do Swing. E para fazer isso, só usando uma Thread separada, como explicou o colega.
Veja porque o seu JniWrapper não está funcionando num thread separado e tente corrigir o problema.

C

Obrigado fabiocsi e ViniGodoy. Queria ter certeza de que realmente é o único modo…
Às vezes é difícil aceitar o óbvio :wink:

Criado 23 de outubro de 2007
Ultima resposta 24 de out. de 2007
Respostas 3
Participantes 3