JFrame está travando no WHILE

4 respostas
C

Olá galera, desculpe-me se ja existe um tópico desses mas infelizmentenão conseguir encontrar a solução para meu problema.
Estou tentando fazer um download de imagens, mas o problema é que chega no While, o JFrame trava e tentei de outra forma com TIMER, mas o problema eh que parece que o timer não roda junto com o programa. Nao escreve literalmente nada. Vou coloar o código para ajudar.

void baixaArquivo(String _url) {
       ActionListener actionListenerT = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                System.out.println(tBytes);
                tBytes =0;
            }
        };
    
        Timer timer = new Timer(1000, actionListenerT);
        timer.start();
        try {
            BufferedInputStream in = new BufferedInputStream(conexao.getInputStream());
            String filename="";
            filename = "C:/imagem.jpg";
            FileOutputStream out = new FileOutputStream(filename);
            byte[] buf = new byte[204800]; // pode aumentar um pouco se quiser
            while ((nBytes = in.read(buf)) &gt 0) {
                out.write (buf, 0, nBytes);
                tBytes += nBytes;
                tRec = nBytes;
                tTotal += tBytes;
                if(tTotal &gt 1024){
                    tTotal /= 1024;
                    tx = tTotal+" KB";
                }else{
                    tx = tTotal+" Bytes";
                }
                if(tRec &gt 1024){
                    tRec /= 1024;
                    velx = tRec+" KB/s";
                }else{
                    velx = tRec+" B/s";
                }
                
                lbVel.setText((tRec) + " KB/s    /    "+tx+" de "+xTam);
            }
            out.flush();
            out.close();
            in.close();
            
        } catch (Exception e) {
            timer.stop();
            System.out.println("ERRO");
        }
        
    }

Se conseguirem identificar o problema agradeço a todos.
Obrigado

4 Respostas

davidbuzatto

Quando vc precisa fazer alguma operação demorada e precisa que sua interface gráfica se comporte da forma apropriada, ou seja, sem travar, você precisa delegar a atualização da mesma para uma outra thread.
Esse travamento ocorre pois a interface é atualiza somente quando o método termina seu trabalho.

Para resolver esse problema você deve utilizar o método invokeLater da classe SwingUtilities, que recebe um Runnable que faz o trabalho de atualizar a interface.

No Java 1.6 foi adicionada a implementação da classe SwingWorker que deixa esse trabalho de atualização mais transparente para o desenvolvedor.

Dê uma pesquisada sobre SwingWorker e SwingUtilities que você vai achar como resolver seu problema.

Até mais!

C

realmente axei um pouco complicadinho, mas só estuda um pokinho que eu axo que vai da certo, ainda não testei, mas obrigado pela ajuda davidbuzatto :stuck_out_tongue:
[]'s

lina

Oi,
não faltou um break ai não?

davidbuzatto

Pelo que entendi o processo não tem um tempo específico. Ele precisa ler o IimputStream até o mesmo terminar ((nBytes = in.read(buf)) > 0). Quando terminar, sai do while.

O correto, como falei, é colocar o processo para rodar em background e desabilitar a interface… Quando terminar o processo habilita de novo a interface.

Criado 3 de julho de 2007
Ultima resposta 4 de jul. de 2007
Respostas 4
Participantes 3