Problema chamando JDialog a partir de outra Thread

0 respostas
Rafael_Nascimento

galera tenho uma aplicação desktop que envia um arquivo a um servidor remoto qdo o usuário clica no botão Concluir Documento
dependendo da conexão de internet do usuário, este processo (envio do arquivo e resposta do servidor confirmando o recebimento) leva em torno de 6 segundos

durante esse processo, gostaria de exibir uma JDialog modal com um JProgressBar, para que o usuário veja q o processo está em andamento e a a plicação não parou.
Quando a aplicação desktop receber a confirmação do servidor, a JDialog deve sumir.

já consegui implementar esse esquema, mas o problema é que a JDialog não “pinta” o seu conteudo, fica tudo branco. Acho q tem algo haver com o método paint()… etc, mas não sei o que fazer pra que a JDialog desenhe os componentes.

obs: a JDialog é chamada a partir de outra thread para que a aplicação não pare, esperando o usuario fechar a dialog.

código relevante do controle que chama a Thread com a Dialog e envia o documento ao servidor

public void concluirDocumento(){
...
  Thread threadBarraProgresso = new ThreadBarraProgressoIndeterminada();
   try {
                //barra de progresso para que o usuário veja que o processo está em andamento
                threadBarraProgresso.start();

                //envia o documento ao servidor remoto
                documentoService.enviarDocumento(usuarioService.getUsuario(), byte[] documento);

                //se chegar aqui, o server confirmou o recebimento, e a Thread é interrompida
                threadBarraProgresso.interrupt();

                JOptionPane.showMessageDialog(null, "Arquivo enviado com sucesso.");
   } //fim try
   catch(Exception e){
            //ocorreu algum erro, mas fecha a dialog da mesma forma
            threadBarraProgresso.interrupt();
            e.printStackTrace()
  }
}//fim metodo

e minha classe que extende Thread

public class ThreadBarraProgressoIndeterminada extends Thread{
    
    //inner class que extende JDialog
    DialogProgressBar dialogIndeterminateProgress;

    @Override
    public synchronized void run() {
        //inicia a Thread: instancia a JDialog e mostra
        dialogIndeterminateProgress = new DialogProgressBar(null, true);        
        dialogIndeterminateProgress.setVisible(true);        
    }
    
    @Override
    public void interrupt() {
        //finaliza a Thread e esconde a JDialog
        dialogIndeterminateProgress.setVisible(false);
        super.interrupt();                
    }

    //classe interna que extende JDialog
    private class DialogProgressBar extends JDialog{
        
        private JProgressBar progressBar;

        //construtor configura a JDialog e insere os compoenentes 
        public DialogProgressBar(Frame parent, boolean modal) {
            super(parent, modal);
            this.progressBar = new JProgressBar();
            this.progressBar.setBounds(-10, 0, 370, 20);
            //barra de progresso é indeterminada
            this.progressBar.setIndeterminate(true);        
            
            this.setLayout(new FlowLayout(FlowLayout.CENTER));   
            //adiciona JProgressBar no painel         
            this.getContentPane().add(progressBar);
            this.setResizable(false);
            this.setSize(370, 32);   
            this.setTitle("Enviando Documento, aguarde ...");                        
        }        
    }      
}

como disse, já funciona legal, só que a JDialog não desenha a JProgressBar no seu container (testei outros componentes como JLabel, mas tb não desenha) fica tudo branco.

alguém tem alguém tem alguma dica ??
valeu

Criado 21 de setembro de 2012
Respostas 0
Participantes 1