我需要在从文件读取的方法中更新jProgressBar并执行一些操作。 我试图通过这种方法更新进度条:
public void progressUpdate(int percent) {
System.out.println("Update = "+percent);
synchronized (jMainProgressBar) {
jMainProgressBar.setValue(percent);
}
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
jMainProgressBar.updateUI();
jMainProgressBar.repaint();
}
});
}
当方法完成时,它是如何工作的。但如果我通过这种方法不断更新,那么没有任何反应。
也许有些人知道如何改进这种方法?
对于更多建议工作者线程而言,它也会很好。
答案 0 :(得分:3)
您可能想要
public void progressUpdate(final int percent) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jMainProgressBar.setValue(percent);
}
});
}
答案 1 :(得分:2)
不要使用Thread。使用计时器。请参阅以下内容:
答案 2 :(得分:1)
根据您提供的评论(但不是来自问题!),您正在对事件派遣线程(EDT)进行繁重的工作。这会阻止该线程并避免执行任何计划的重绘。这就是为什么你只能在工作完成后看到JProgressBar
的更新,因为那是EDT可用于执行重绘的时刻。
解决方案已经在其他人发布的链接中提供,但它基本上归结为:
JProgressBar
的进度实现此目的的两种最常见方法是使用SwingWorker
或使用工作线程中的SwingUtilities.invokeLater
。
所有相关链接都可以在Yohan Weerasinghe的答案中找到
答案 3 :(得分:0)
查看
Timer barTimer;
barTimer=new Timer(100,new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
barvalue++;
if(barvalue>jProgressBar1.getMaximum())
{
/*
* To stop progress bar when it reaches 100 just write barTime.stop()
*/
barTimer.stop();
barvalue=0;
}
else
{
int a=(int)jProgressBar1.getPercentComplete();
jProgressBar1.setStringPainted(true);
jProgressBar1.setValue(barvalue);
}
}
});
barTimer.start();
检查此链接的代码 http://java23s.blogspot.in/2015/10/how-to-implement-progress-bar-in-java.html