ProgressBar não atualiza

Olá pessoal!

Estou há um bom tempo quebrando a cabeça nesse problema.

Tenho duas classes onde, a primeira é uma Interface e a segunda contém métodos. A primeira classe contém um progressbar e um botão “Start”. Ao clicar no botão “Start”, um método da segunda classe é chamado para atualizar a progressbar. Mas não está atualizando… não sei mais o que fazer… já tentei usar Thread, Swingworker, um set normal…

Segue abaixo as Classes:

Classe Main (Interface)

private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {
	banco banco = new banco();
	banco.teste();
}

public void set(int i) {
	progress.setValue(i);
}

Classe Banco

public class banco {
	Main main = new Main();

	public void teste() {
		for (int i = 1; i < 200000; i++) {
			main.set(i);
			System.out.println("Processo : " + i);
		}
	}
}

Informações:
Netbeans
Swing

O JProgressBar provavelmente não armazena o valor quando atualizado no laço, ou seja, ele sempre terá o valor 1, onde você deve pegar o valor atual dele e incrementar mais 1!

Tente fazer: progress.setValue(progress.getValue() + 1);

Bom dia Jonathan!

Mesmo pegando o valor atual da ProgressBar como você sugeriu, não funcionou…

Na verdade ele funciona, agora se você quiser ver ele atualizando passo a passo vai precisar utilizar Thread para realizar a tarefa.

2 curtidas

Coloquei um print na tela para verificar o valor da progressBar e conforme você disse, está funcionando mesmo. Mas mesmo incluindo uma chamada de Thread, não consigo visualizar o progresso…

Segue as imagens das classes e a evidência do ProgressBar sendo populado


Obs.: O máximo está setado como 100.

Não sei mais o que posso tentar pra funcionar…

Pra facilitar seu entendimento segue uma classe de exemplo que tenho guardada aqui, comentei alguns trechos do código para ficar fácil de entender.

package teste;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

/**
 *
 * @author jhenrique
 */
public class ExemploJProgressBar extends JPanel {

    JLabel resultLabel;
    JProgressBar progressBar;

    public ExemploJProgressBar() {
        //Criação do ProgressBar
        progressBar = new JProgressBar();
        progressBar.setPreferredSize(new Dimension(150, 25));
        progressBar.setStringPainted(true);
        this.add(progressBar);
        
        //Criação do Label
        resultLabel = new JLabel("Resultado: Não iniciado");
        resultLabel.setPreferredSize(new Dimension(250, 25));
        this.add(resultLabel);
        
        //Criação do botão
        JButton button = new JButton("Iniciar");
        button.setPreferredSize(new Dimension(75, 25));
        this.add(button);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                iniciar();//inicia o processo de atualização do JProgressBar
            }
        });
    }

    private void iniciar() {
        resultLabel.setText("Resultado: Em andamento...");
        progressBar.setString("0%");
        
        new SwingWorker<String, Integer>() {
            
            @Override
            protected String doInBackground() throws Exception {
                for (int i = 0; i < 100; i++) {
                    atualizaProgressBar(i); //Método que atualiza o progresso de 1 em 1
                                        
                    Thread.sleep(100); //Delay na operação
                }
                atualizaProgressBar(100);
                return "Concluido";
            }

            //Método que atualiza o jProgressBar
            protected void atualizaProgressBar(int i) {
                int value = i;//Recebe o valor incrementado que veio por parâmetro
                progressBar.setValue(value);//Atualiza o progress
                progressBar.setString(Integer.toString(value).concat("%"));//Atualiza a escrita do progress
            }
            
            @Override
            protected void done() {
                try {
                    finalizarProcesso(get());
                } catch (InterruptedException | ExecutionException e) {
                    e.printStackTrace();
                }
            }
            
        }.execute();
    }
    
    private void finalizarProcesso(String result) {
        resultLabel.setText("Resultado: ".concat(result));
    }

    public static void main(String ... args) {
        //Criação do frame
        JFrame frame = new JFrame();
        frame.setContentPane(new ExemploJProgressBar());
        frame.setSize(500, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

Na classe Banco você está criando outro objeto da classe Main, não está utilizando a instância existente que instanciou o Banco.
Ou seja, você tem dois objetos do tipo Main e está atualizando o progresso do objeto errado.