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…
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!
Mesmo pegando o valor atual da ProgressBar como você sugeriu, não funcionou…
J
Jonathan_Medeiros2 likes
Na verdade ele funciona, agora se você quiser ver ele atualizando passo a passo vai precisar utilizar Thread para realizar a tarefa.
G
Gustavopeotta1
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…
J
Jonathan_Medeiros
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.
packageteste;importjava.awt.Dimension;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.concurrent.ExecutionException;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JProgressBar;importjavax.swing.SwingWorker;/** * * @author jhenrique */publicclassExemploJProgressBarextendsJPanel{JLabelresultLabel;JProgressBarprogressBar;publicExemploJProgressBar(){//Criação do ProgressBarprogressBar=newJProgressBar();progressBar.setPreferredSize(newDimension(150,25));progressBar.setStringPainted(true);this.add(progressBar);//Criação do LabelresultLabel=newJLabel("Resultado: Não iniciado");resultLabel.setPreferredSize(newDimension(250,25));this.add(resultLabel);//Criação do botãoJButtonbutton=newJButton("Iniciar");button.setPreferredSize(newDimension(75,25));this.add(button);button.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){iniciar();//inicia o processo de atualização do JProgressBar}});}privatevoidiniciar(){resultLabel.setText("Resultado: Em andamento...");progressBar.setString("0%");newSwingWorker<String,Integer>(){@OverrideprotectedStringdoInBackground()throwsException{for(inti=0;i<100;i++){atualizaProgressBar(i);//Método que atualiza o progresso de 1 em 1Thread.sleep(100);//Delay na operação}atualizaProgressBar(100);return"Concluido";}//Método que atualiza o jProgressBarprotectedvoidatualizaProgressBar(inti){intvalue=i;//Recebe o valor incrementado que veio por parâmetroprogressBar.setValue(value);//Atualiza o progressprogressBar.setString(Integer.toString(value).concat("%"));//Atualiza a escrita do progress}@Overrideprotectedvoiddone(){try{finalizarProcesso(get());}catch(InterruptedException|ExecutionExceptione){e.printStackTrace();}}}.execute();}privatevoidfinalizarProcesso(Stringresult){resultLabel.setText("Resultado: ".concat(result));}publicstaticvoidmain(String...args){//Criação do frameJFrameframe=newJFrame();frame.setContentPane(newExemploJProgressBar());frame.setSize(500,200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}
S
staroski
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.