JProgressBar com SwingWorker?

Salve galera…To tentando montar um exemplo pelo que ja vi com JProgressBar e SwingWorker, quero fazer com que a barra va se preenchendo.

to tentando assim:

public class ProgressBar{
    JProgressBar barra;

    public void executaProgresso(JProgressBar progresso){
        this.barra = progresso;
        barra.setMinimum(0);
        barra.setMaximum(100);
        barra.setStringPainted(true);

        SwingWorker worker = new SwingWorker() {
            @Override
            protected Object doInBackground() throws Exception {
                for(int x = 0; x <= 10000; x++){
                    barra.setValue(x);
                }
                return null;
            }

            protected void done(){
                
                //barra.setValue(0);
                System.out.println("Feito...");
            }
        };
        worker.execute();

    }

//aqui invoco o metodo
 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        new ProgressBar().executaProgresso(progresso);

    }

Nao consigo fazer com que a barra va se preenchendo. Usando setIndeterminate(true), funciona, a barra fica processando ateh acabar a contagem, mas com a porcentagem naum preenche, ja aparece a barra com 100% sem mostrar o preenchimento gradativo…

Alguem tem alguma ideia de o pq essa barra naum vai se preenchendo gradativamente ??

obrigado

Tente assim amigo

		SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>()
		{
			@Override
			protected Void doInBackground() throws Exception
			{
                                barra.setMinimum(0);
                                barra.setMaximum(100);
                                barra.setStringPainted(true);
				return null;
			}

			@Override
			protected void done()
			{
                               super.done();
                               for(int x = 0; x <= 10000; x++){
                                  barra.setValue(x);
                               }
                               System.out.println("Feito...");				
			}
		};
		worker.execute();

Fernando o que você fez está certo. Porém:

  1. O loop vai rodar muitíssimo rápido, você dificilmente vai ver a barra sendo preenchida com um loop assim;
  2. Se o seu contador vai até 10.000 porque o máximo da sua barra está definido em 100?

O código certo seria assim:

[code]public class ProgressBar{
JProgressBar barra;

public void executaProgresso(JProgressBar progresso){
    this.barra = progresso;
    barra.setMinimum(0);
    barra.setMaximum(10000);
    barra.setStringPainted(true);

    SwingWorker worker = new SwingWorker() {
        @Override
        protected Object doInBackground() throws Exception {
            try {
                for(int x = 0; x &lt;= 10000; x++){
                    barra.setValue(x);
                    Thread.sleep(20); //Espera 20ms
                }
            } catch (InterruptedException e) {
            }
            return null;
        }

        protected void done(){
            //barra.setValue(0);
            System.out.println(&quot;Feito...&quot;);
        }
    };
    worker.execute();
}

//aqui invoco o metodo
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
new ProgressBar().executaProgresso(progresso);
}
[/code]

1 curtida

Agora sim, corrigi. Acidentalmente tinha copiado o código errado do leonardobhbr, não o seu código.

Opa Vini e leo, td blz com vcs ???

Muito obrigado pela atenção, vou fazer mais testes qquer coisa posto aqui.

t+

Abaixo o código de uma pequena modificação, onde o tamanho do progressbar é variável de acordo com algum parâmetro do usuário:



import javax.swing.JOptionPane;
import javax.swing.SwingWorker;

public class Principal extends javax.swing.JFrame {

    public Principal() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        botao = new javax.swing.JButton();
        pb = new javax.swing.JProgressBar();
        jLabel1 = new javax.swing.JLabel();
        tfImagens = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        botao.setText("Importar");
        botao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoActionPerformed(evt);
            }
        });

        pb.setStringPainted(true);

        jLabel1.setText("Quantidade de imagens:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfImagens, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botao))
                    .addComponent(pb, javax.swing.GroupLayout.PREFERRED_SIZE, 347, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(24, 24, 24))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(108, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(tfImagens, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botao))
                .addGap(54, 54, 54)
                .addComponent(pb, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(78, 78, 78))
        );

        pack();
    }// </editor-fold>

    private void botaoActionPerformed(java.awt.event.ActionEvent evt) {
        
        final int numImages = Integer.parseInt(tfImagens.getText());
        
        SwingWorker worker = new SwingWorker() {

                            @Override
                            protected Object doInBackground() throws Exception {

                                pb.setMaximum(numImages);
                                
                                for (int x = 0; x <= pb.getMaximum(); x++) {
                                    pb.setValue(x);
                                    Thread.sleep(200);
                                }
                                return null;
                            }

                            protected void done() {

                                //barra.setValue(0);  
                                System.out.println("Feito...");
                                JOptionPane.showMessageDialog(null, "Progresso concluído");
                            }
                        };
                        worker.execute();
    }


    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Principal().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton botao;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JProgressBar pb;
    private javax.swing.JTextField tfImagens;
    // End of variables declaration
}

Essa classe

me ajudou bastante!
Obrigado

[quote=andersonneto]Essa classe

me ajudou bastante!
Obrigado[/quote]

Por favor, não ressuscite tópicos antigos (esse tem mais de 3 anos) à toa.