[RESOLVIDO] Atualizar contador durante loop (for) de copia de arquivos

1 resposta
W

Ola pessoal. Estou com um probleminha meio bobo.
Ta tudo funcionando, não é nenhum erro de compilação ou problema grave.

O que acontece é o seguinte. Fiz um jar que copia os arquivos para uma unidade mapeada em outro estado. Ele copia o arquivo belezinha, porem não consigo fazer com que o contador seja atualizado na tela. Na verdade a tela fica travada até acabar a copia dos arquivos, quando acaba a copia dos arquivos é que ele atualiza a tela.

Como faço pra ele atualizar a tela a cada termino da copia? O comando ta certo coloquei uma saida no prompt pra testa, a saida aparece, somente a interface grafica que fica travada mesmo ate acaber a copia.

private void copiarAutos() {
        int cont = 0;
        //Copiar arquivo para pastaDestino
        for (String arquivoAtual : arquivosOrigem) {
            File origem = new File(arquivoAtual);
            File destino = new File(enderecoDestino + "\\" + arquivoAtual.substring(arquivoAtual.lastIndexOf("\\"), arquivoAtual.length()));
            System.out.print("Copiando: " + origem.getName() + " > " + destino.getName() + " - ");
            try {
                Arquivo.copyFile(origem, destino);
            } catch (IOException ex) {
                setErro("Não foi possível enviar o auto!" + ex.getMessage());
                break;
            }
            if (destino.exists()) {
                //Deletar origem do arquvo
                if (!origem.delete()) {
                    setErro("Não foi possível apagar o arquivo de origem!");
                    break;
                } else {
                    System.out.println(" OK");
                }
            } else {
                setErro("O arquivo não foi copiado corretamente");
                break;
            }
            atual.setText(++cont + "");
            atual.updateUI();
            painel.updateUI();
            System.out.println("CONTADOR: " + cont);
        }
        mensagem = "Autos exportados com sucesso!";
        JOptionPane.showMessageDialog(getContentPane(), mensagem, "Concluído!", JOptionPane.INFORMATION_MESSAGE);
        exit();
    }
O metodo copyFile eu tirei de um posto do ViniGodoy:
ViniGodoy:
public static void copyFile(File source, File destination) throws IOException {
        if (destination.exists())
            destination.delete();

        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;

        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            sourceChannel.transferTo(0, sourceChannel.size(),
                    destinationChannel);
        } finally {
            if (sourceChannel != null && sourceChannel.isOpen())
                sourceChannel.close();
            if (destinationChannel != null && destinationChannel.isOpen())
                destinationChannel.close();
       }
   }

1 Resposta

W

Bom consegui resolver o problema, basta chamar o codigo que faz a copia em uma thread e atualizar a tela pela thread.

Criei a classe Copiar dentro da classe principal e coloquei no void run():

class Copiar extends Thread {

        @Override
        public void run() {
            int cont = 0;
            //Copiar arquivo para pastaDestino
            for (String arquivoAtual : arquivosOrigem) {
                File origem = new File(arquivoAtual);
                File destino = new File(enderecoDestino + "\\" + arquivoAtual.substring(arquivoAtual.lastIndexOf("\\"), arquivoAtual.length()));
                System.out.print("Copiando: " + origem.getAbsolutePath() + " > " + destino.getAbsolutePath() + " - ");
                try {
                    Arquivo.copyFile(origem, destino);
                } catch (IOException ex) {
                    setErro("Não foi possível enviar o auto!" + ex.getMessage());
                    break;
                }
                if (destino.exists()) {
                    //Deletar origem do arquvo
                    if (!origem.delete()) {
                        setErro("Não foi possível apagar o arquivo de origem!");
                        break;
                    } else {
                        System.out.println(" OK");
                    }
                } else {
                    setErro("O arquivo não foi copiado corretamente");
                    break;
                }
                atual.setText(++cont + "");
                atual.updateUI();
                painel.updateUI();
                //System.out.println("CONTADOR: " + cont);
            }
            if (erro) {
                JOptionPane.showMessageDialog(getContentPane(), mensagem, "ERRO!", JOptionPane.ERROR_MESSAGE);
            } else {
                mensagem = "Autos exportados com sucesso!";
                JOptionPane.showMessageDialog(getContentPane(), mensagem, "Concluído!", JOptionPane.INFORMATION_MESSAGE);
            }
            exit();
        }
    }

E chamo ele assim:

private void exportarActionPerformed(java.awt.event.ActionEvent evt) {                                         
    new Copiar().start();
}
Criado 5 de janeiro de 2012
Ultima resposta 5 de jan. de 2012
Respostas 1
Participantes 1