JProgressBar não acionando o propertyChange no setProgress
Eu li muitos artigos diferentes sobre o JProgressBar ... incluindo o código desonesto encontrado em Java;Aqui.
A maioria indica que você precisa de um SwingWorker para fazer as coisas acontecerem corretamente, o que faz todo o sentido, eu entendo muito. Eu estou achando que quando eu chamo setProgress (valor) para atualizar a barra de progresso, ele não está acionando o evento propertyChange na maioria das vezes. Eu verifiquei o valor que estou passando para setProgess e isso definitivamente muda sempre, então não tenho certeza se está apenas disparando o evento muito rapidamente? Por favor, veja o código relevante abaixo, qualquer ajuda / explicação seria muito apreciada.
class ProgBar extends SwingWorker
{
public ProgBar()
{
addPropertyChangeListener(new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
if ("progress".equals(evt.getPropertyName()))
{
int value = (Integer)evt.getNewValue();
System.out.println("propertyChange called with: " + value);
loginProg.setValue(value);
}
}
});
loginProg.setStringPainted(true);
loginProg.setValue(0);
setProgress(0);
}
@Override
public Void doInBackground() throws InterruptedException
{
...
int count = 0;
for (Folder f : folders)
{
... // process 'f'
setProgress((int)Math.min(((double)count/folders.length)*100.0, 100.0));
}
...
return null;
}
@Override
public void done()
{
System.out.println("Done called.");
setProgress(100);
loginProg.setValue(100);
}
}
JProgressBar chamou com isso;
private void jButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// Create new thread to run progess bar.
// Otherwise won't be able to update progress bar.
ProgBar pb = new ProgBar();
pb.execute();
}
}
EDITAR:
Sim, então eu deveria ter lido melhor os Javadocs;
Como PropertyChangeListeners são notificados de forma assíncrona nas várias chamadas do Event Dispatch Thread para o método setProgress podem ocorrer antes de qualquer PropertyChangeListeners ser chamado. Para fins de desempenho, todas essas invocações são reunidas em uma única invocação apenas com o último argumento de invocação.
Por exemplo, as seguintes invocações:
setProgress (1);
setProgress (2);
setProgress (3);
pode resultar em uma única notificação PropertyChangeListener com o valor 3.
I.E. minha suposição de que setProgress estava disparando muito rapidamente estava correta. Um ProgressMonitor pode ser uma solução melhor.