Como atualizar JProgressbar?

bom dia pessoal…

bom…meu problema é o seguinte… eu tenho que copia um arquivo de um lugar ao outro, e inseri um JProgressbar pra mostra a quantas anda a execução disso. o problema é que eu não sei como faço pra descobri quanto que ja foi do processo pra atualiza-lo via metodo setValue().

como que eu atualizo assim pessoal???

obrigado desde ja. :wink:

Uai, como é que você está fazendo a cópia então?

eu vo copia um arquivo de um lugar para o outro usando a classe File…

se eu intendi direito sobre o que eu li sobre JProgressbar, eu vo ter que deixar uma outra thread atualizando ele, colocando novos valores, exemplo:

[code]cria e instancia a jprogressbar, supondo q com o nome progresso, como em JProgressBar progresso=new JProgressBar();

progresso.setStringPainted(true);

progresso.setMaximum(100);//aqui é o final ad barra, nos 100, quando atualizar eu posso ir colocando pra ja fica facil de imagina a porcentagem, por isso escolhi um total de 100

//coloco ele no meu countainer, do o .setBounds, etc

ai começo minha operação de copia o arquivo em uma thread2

ai eu vejo a quantas ta a copia do arquivo e vo dando os progresso.setValue(algum numero); //isso que eu não sei, ve quanto que ja foi da operação[/code]

desculpa se espressei mal minha pergunta

pra poder incrementar, vc tem q saber o TOTAL do processo, e fazer um cálculo…
geralmente é calculo moleza mas dependendo da operação pode se tornar complexo.

Dica: use setIndeterminate( true ) na sua JProgressaBar… a barrinha fica indo de um lado pro outro e vc nao precisa se preocupar
com cálculos. ( acho que até a instalação do IE 7 usa assim ).

Abraço

Não sabia que a classe java.io.File copiasse arquivos. No máximo você pode usá-la para renomear arquivos.

eu que devo ter me confundido então… axo que no final das contas eu acabaria usando FileOutputStream…ou algo do tipo… eu tava aqui na realidade projetando, pensando como que eu ia fazer as coisa, por isso que não tinha visto exatamente como que ia fazer…

fabio, obrigadão pela dica do setIndeterminate( true ), sendo assim axo que eu vo tira o setStringPainted(true)… não intendi bem o que vc falo do calculo…como assim, eu vou ter que descobri quanto tempo que demora pra executar o que tiver que fazer e ai ir atualizando de acordo com o tempo né?? mais como que eu descubro isso??rsrs

se ajuda em alguma coisa, eu tenho uma pasta do servidor mapeada no pc, pretendo que o programa olhe la de 5 em 5 minutos se tem algum arquivo novo, ele vai ta recebendo um array dos nomes dos arquivos, com o .list de um objeto file, depois dando um .lastModified em cada um dentro de um loop, e comparando com um txt de log que vai marca quais arquivos ja foram processados e de quando eram, caso não tenha processado ele, ou tenha modificações, deve reenvia-lo pra ca. Por estar mapeada no pc ja, a pasta, não axo necessario complica, passar pela rede, manda o objeto que tenha esses arquivos pela rede por exemplo e salva aqui… vai da um copiar e colar mesmo…

em se tratando de rede, eu pensei em descobri a velocidade da rede, o tamanho do arquivo e calcula quanto tempo demora pra envia o arquivodividindo um pelo outro mais…achei inviavel, deve ter algum jeito mais facil…(tem???)

pessoal, disculpa ae, foi mal a gafe tingol… so meio iniciante por enquanto…

Que mania de complicar…
Que eu saiba, para copiar um arquivo em outro existem duas maneiras, uma usando FileInput/OutputStream, e a outra usando FileChannel.
Com as duas maneiras você normalmente usa um loop, porque não se pode copiar muitos bytes de uma vez sem esgotar a memória.
Usualmente você faria a cópia de um arquivo em outro, usando pseudo-código:

variáveis: número de bytes do arquivo de entrada, número de bytes lidos, total de bytes escritos, buffer, arquivo de entrada, arquivo de saída, porcentagem da barra de progresso

número de bytes do arquivo := determinar tamanho do arquivo de entrada
abrir arquivo de entrada
abrir arquivo de saída
enquanto o arquivo de entrada não acabar
   ler no buffer alguns bytes do arquivo de entrada
   número de bytes lidos := número de bytes lidos do arquivo de entrada, na leitura efetuada no buffer
   gravar no arquivo de entrada os bytes do buffer (a quantidade de bytes a serem gravados é o número de bytes lidos) 
   total de bytes escritos := total de bytes escritos + número de bytes lidos
   porcentagem da barra de progresso := 100% * total de bytes escritos / número de bytes do arquivo de entrada
   atualizar a barra de progresso
fim enquanto
fechar arquivo de saída
fechar arquivo de entrada

Usualmente, para o buffer de bytes, você cria um array de bytes de cerca de 32 kbytes, que é um bom valor.

brigadão tingol…

eu vo tenta fazer isso, ai depois eu ponho meu codigo aqui (não manjo mto dessas classes File, File*, minha experiencia disso se resume a ler e escrever arquivos txt)…

se der algum problema eu grito…rsrsrs

brigadão…vlw mesmo kra…

Daew brother blz.

Inton neste site tem varios exemplos bem intuitivos.

apenas para caso seja util para alguem… a classe que copia o arquivo prontinha (só não atualiza a progressbar, mais ja tem a variavel status no jeito, pra ir atualizando, pode-se enviar o valor dela a cada loopada para um metodo setStatus na classe do ambiente grafico e la da o .setValue() no objeto da barra de status pra ir atualizando…

segue


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JOptionPane;
public class CopiarArquivo {
    

    public CopiarArquivo() {
    }
    
    public boolean copiar(String entrada, String saida){
        
      FileInputStream origem = null;
      FileOutputStream destino = null;
      boolean success = true;
      
      try {
          
         origem = new FileInputStream(entrada);
         destino = new FileOutputStream(saida);
         byte[] buffer=new byte[5000];
         
        int tamanho=origem.available();//numero de bytes do arquivo de entrada
        int status=0;//numero de bytes lidos/escritos, usado pra porcentagem terminada da operação na barra de progresso
         
        //loop que efetivament grava o arquivo
         while(status<=tamanho){
             origem.read(buffer);
             destino.write(buffer);
             status+=buffer.length;
         }
        
      } catch (IOException e) {
         success = false;
      } catch (OutOfMemoryError e) {
         success = false;
      } 
         try {
            if (origem != null) {
               origem.close();
            }
            if (destino != null) {
               destino.close();
            }
         } catch (IOException e) {}     
      
      
      return success;
        
    }
    
    public static void main(String args[]){
        CopiarArquivo ca=new CopiarArquivo();
        String entrada=JOptionPane.showInputDialog(null, "digite a origem do arquivo a ser copiado");
        String saida=JOptionPane.showInputDialog(null, "digite destino do arquivo a ser copiado");
        
        ca.copiar(entrada, saida);
        
    }
    
}


/*algoritmo feito pelo tingol
 *
 variáveis: número de bytes do arquivo de entrada, número de bytes lidos, 
 total de bytes escritos, buffer, arquivo de entrada, arquivo de saída, 
 porcentagem da barra de progresso   
  
número de bytes do arquivo := determinar tamanho do arquivo de entrada   
abrir arquivo de entrada   
abrir arquivo de saída   
enquanto o arquivo de entrada não acabar   
   ler no buffer alguns bytes do arquivo de entrada   
   número de bytes lidos := número de bytes lidos do arquivo de entrada, na leitura efetuada no buffer   
   gravar no arquivo de entrada os bytes do buffer (a quantidade de bytes a serem gravados é o número de bytes lidos)   
   total de bytes escritos := total de bytes escritos + número de bytes lidos   
   porcentagem da barra de progresso := 100% * total de bytes escritos / número de bytes do arquivo de entrada   
   atualizar a barra de progresso   
fim enquanto   
fechar arquivo de saída   
fechar arquivo de entrada   
 */

po…q droga… não ta atualizando a barra…

to com um problema na classe do meu ambiente grafico, em relação a parte de atualiza a JProgressBar…

eu tenho o meu ambiente grafico, com a JProgressBar, que segue abaixo, a classe Janela, e outra janela que eu fiz com um botão só pra aumenta o valor da barra pra testa, e assim mesmo não funciona, por isso que acredito que o problema seja na classe Janela e não na que eu coloquei a regra de negocio.

pra aumentar o valor da barra, eu coloquei um metodo setX, que recebe o valor da porcentagem e o atribui a barra, mais não esta funcionano

segue o codigo das duas classes:

TestaBarra // que é chamada da propria classe Janela

import java.awt.Container;
import javax.swing.*;
import java.awt.event.*;
public class TestaBarra extends JFrame{
    
    /** Creates a new instance of TestaBarra */
    public TestaBarra() {
        super("testa");
    }
    public static void main(String args[]){
        TestaBarra t=new TestaBarra();
        t.cria();
        
    }
    
    int x=0;
    public void cria(){
        setSize(575,594);
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container tela = getContentPane();
        setLayout(null);
        
        JButton botao=new JButton("incrementa");
        botao.setBounds(25,25,100,25);
        tela.add(botao);
        
        
        botao.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    Janela j=new Janela();
                    x+=5;
                    j.setX(x);
                    JOptionPane.showMessageDialog(null, x);
                }
            }
        );
        
    }
}

classe janela //a principal


/*
 *esse programa tem por finalidade copiar os arquivos de uma pasta no server em outra local
 *continuamente, ou seja, atualizando, e os arquivos do server depois de copiados 
 *devem ir para uma terceira pasta de backup, deixando a anterior vazia
*/

import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileInputStream;

//era mais facil ter importado o swing, io e awt inteiros...rs só o swing inteiro e os outros não ja livrava uma carinha ja...

public class Janela extends JFrame implements Runnable{
    
    private JTextField verificaEm;
    private JTextField insereEm;
    private JTextField backupEm;
    public JProgressBar progresso=new JProgressBar();
    private JRadioButton sobrescrever;
    private JRadioButton naosobrescrever;
    private JRadioButton sobrescreverantigos;
    private JLabel acao=new JLabel("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");//eu fiz isso pra testa até onde chega na tela...depois eu tiro
    
    private String data="30/11/07", ram="";
    boolean ativada=false;
    public int x=0;
    
    static Thread verifica;
   
    public void setX(int x){
        progresso.setValue(x);
        //repaint();  <-- não adianto
    }
    
    public void run(){
        
        while(true){
            
            //System.out.println(Thread.currentThread().getName());//só pra teste da thread
            Atualizador a=new Atualizador();
            a.Processa(verificaEm.getText(), insereEm.getText());
            //esse bloco ai em baixo faz a thread espera pra executa denovo
            synchronized(this) {  
                    try {  
                        this.wait(10000);//a cada minuto 
                    } catch (InterruptedException ex) {}  
            }
            
        }    
    }
    
    
    public Janela() {
        super("Copiador de arquivos novos");
        
    }
    public static void main(String args[]){
        Janela j = new Janela();  
        j.montaJanela();
        
        verifica=new Thread(j);
    }
    public void montaJanela(){
        //parametros da janela
        setSize(575,594);
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container tela = getContentPane();
        setLayout(null);
        tela.setBackground(new Color(0,0,0));
        
        //areas de texto da pasta a se verificar e da pasta a se inserir os arquivos, bem como os botões
        verificaEm=new JTextField();
        insereEm=new JTextField();
        
        //especifica o tamanho da area de texto e a insere na tela
        verificaEm.setBounds(30,70,400,20);
        tela.add(verificaEm);
        
        //idem anterior, para a outra area de texto
        insereEm.setBounds(30,110,400,20);
        tela.add(insereEm);
        
        //2 botões para chamarem fileshooser para ajudar o usuario a escolher o endereço, ai abaixo
        
        //chama a api do botão, depois fala o tamanho, depois tira a borda e depois adiciona na tela
        JButton procurar1=new JButton("Procurar");
        procurar1.setBounds(440, 70,100,20);
        procurar1.setBorder(null);
        
        tela.add(procurar1);
        
        //idem acima
        JButton procurar2=new JButton("Procurar");
        procurar2.setBounds(440,110,100,20);
        procurar2.setBorder(null);
        tela.add(procurar2);
        
        //textos não selecionaveis na janela para explicação, labels
        
        JLabel explica1=new JLabel("Diretorio a procurar por arquivos recentes");
        explica1.setBounds(30,45,270,25);
        explica1.setForeground(new Color(255,255,255));
        tela.add(explica1);
        
        JLabel explica2=new JLabel("Diretorio à salvar os arquivos recentes");
        explica2.setBounds(30,85,270,25);
        tela.add(explica2);
        explica2.setForeground(new Color(255,255,255));
        
        //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
        //"Copiando o arquivo <nome com maximo de 25 caracteres> do servidor"
        acao.setBounds(30,150,285,25);
        acao.setForeground(new Color(255,255,255));
        tela.add(acao);
        
        //essa proxima parte é complicada, deve-se criar o objeto da area de texto para adiciona-lo
        // no objeto de barra de rolagem, para poder adicionar as barras de rolagem lateral e inferior
        //mais pra isso funciona, esses corno tem que ta dentro de um objeto de painel, ou seja
        //cria-se o painel, adiciona-se a ele a barra de rolagem, e a essa a area de texto, criando-se
        //as coisas na ordem inversa a se usar.
        
        JTextArea resumo=new JTextArea(20,50);//aqui vai ter aquelas mensagem de "tal arquivo copiado com sucesso"
        resumo.setBackground(new Color(0,0,0));
        
        resumo.setEditable(false);
        tela.add(resumo);
        
        JScrollPane painelrolagem=new JScrollPane();
        painelrolagem = new JScrollPane(resumo);
        painelrolagem.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        painelrolagem.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        
        JPanel painel=new JPanel();
        painel = new JPanel();
        painel.setBackground(new Color(0,0,0));
        painel.add(painelrolagem);
        painel.setBounds(0,210,569,350);//
        tela.add(painel);
        
        
        progresso.setBounds(330,150,100,20);//30,188,150,20
        //progresso.setIndeterminate(true);
        progresso.setMaximum(100);
        progresso.setStringPainted(true);
        progresso.setValue(x);
        tela.add(progresso);
        progresso.setVisible(true);
        
        JButton atualizar=new JButton("atualizar");
        atualizar.setBounds(440,150,100,20);
        atualizar.setBorder(null);
        tela.add(atualizar);
        
        //esses 2 serão usados pra ser se irá sobrescrever arquivos antigos
        sobrescrever=new JRadioButton("sobrescrever arquivos");
        naosobrescrever=new JRadioButton("não sobrescrever arquivos");
        sobrescreverantigos=new JRadioButton("sobrescrever arquivos antigos");
        
        sobrescrever.setBounds(30,180,155,20);
        sobrescrever.setBackground(new Color(0,0,0));
        sobrescrever.setForeground(new Color(255,255,255));
        tela.add(sobrescrever);
        
        naosobrescrever.setBounds(185,180,178,20);
        naosobrescrever.setBackground(new Color(0,0,0));
        naosobrescrever.setForeground(new Color(255,255,255));
        naosobrescrever.setSelected(true);
        tela.add(naosobrescrever);
        
        sobrescreverantigos.setBounds(363,180,205,20);
        sobrescreverantigos.setBackground(new Color(0,0,0));
        sobrescreverantigos.setForeground(new Color(255,255,255));
        tela.add(sobrescreverantigos);
        
        ButtonGroup bg= new ButtonGroup();
        bg.add(sobrescrever);
        bg.add(naosobrescrever);
        bg.add(sobrescreverantigos);
        
        atualizar.addActionListener(
            new ActionListener(){
            
                public void actionPerformed(ActionEvent e){
                    try {
                        if (!(verificaEm.getText().equals("")||insereEm.getText().equals("")))
                            if (ativada==false){
                                verifica.start();
                                ativada=true;
                            }
                        else
                            JOptionPane.showMessageDialog(null, "preencha os endereços");
                        

                    } catch(IllegalThreadStateException i){
                        System.out.println("axo q deu merda...rs");
                    }
                }
            }                
        );
        
        
        //aqui, criaremos estarão os codigos que vão chamar o metodo que deve ser chamado ao se clicar nos botões
        //esses metodos terão o codigo que deve ser feito caso o usuario clique
        
        //usei o mesmo metodo pra ambos os botões, pra aproveita o mesmo objeto, 
        //pq essa porcaria foi verificada em 10 Mega na memoria no ctrl alt e del,
        //imagina ter 2 por motivos besta
        procurar1.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    
                    botaoEscolher(e, true);                    
                    
                }
            } 
        );
        procurar2.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    
                    botaoEscolher(e, false);                    
                    
                }
            } 
        );
        
        sobrescreverantigos.addActionListener(        
                new ActionListener(){
                    public void actionPerformed(ActionEvent e){
                        do{
                            try {
                                ram=JOptionPane.showInputDialog("insira uma data no formato dd/mm/aa, ou clique em cancelar para manter data antiga, "+data);
                                if (ram.equals(null))
                                    ram=data;
                            } catch (Exception ex) {
                                    //JOptionPane.showMessageDialog(null, "sera mantida a data de "+data);
                                    ram=data;
                            }
                        }while(ram.equals(""));
                            data=ram;
                    }  
                }
        );
                
       
        //precisei fazer isso ai em baixo pra aparecer a janela logo,...senao aparece um botão...depois outro...por ai vai
       show();
       repaint();
       
       TestaBarra tb=new TestaBarra();
       tb.cria();
    }
    
    public void botaoEscolher(ActionEvent e, boolean botao){
        
        JFileChooser escolher = new JFileChooser();
        escolher.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                    
        String pasta="";
        int res = escolher.showOpenDialog(null);
        
        if(res == JFileChooser.APPROVE_OPTION){
                
                File diretorio = escolher.getSelectedFile();
                pasta = diretorio.getPath();
                
                if (botao)
                    verificaEm.setText(pasta);
                else
                    insereEm.setText(pasta);
            
        }
        else
            JOptionPane.showMessageDialog(null, "Voce nao selecionou nenhum diretorio."); 
        
    }
    
    
}

aeee consegui resolver

coloquei a variavel status da classe que copia os arquivos como statica, acesso ela da classe Janela e atualizo a JProgressBar como valor dela e seto o total da barra com a variavem tamanho, tb estatica agora…

tingol, esta funcionando, passando o arquivo direitinho, mais eu ainda to com um problema, antes de terminar de enviar o arquivo, ja aparece o icone dele do outro lado, e clicando ele abre normalmente…

while(status<=tamanho){
             origem.read(buffer);
             destino.write(buffer);
             destino2.write(buffer);
             
             status+=5000;//buffer tem 5000 posições
}
        System.out.println(origem.toString());

sei que não foi terminado de envia o arquivo pq não apareceu o conteudo do objeto origem, sinal que não chego no System.out ai, mais o icone do arquivo ta la no destino e abre normal…(fechei a janela antes de termina de envia, tentei abri o icone e foi)

sera que não tem problema? tipo, a execução do arquivo parar na metade ??? (o arquivo que eu testei era um instalador e eu não dei os "proximo"s… rs)

como que eu resolvo isso???