我已经编写了使用swing libs的代码,当添加一个actionlistener时,不会更新progressBar。java swing progressBar
没有按钮和动作侦听器,它的工作效果很好。如何尽可能简单而干净地强制progressBar更新?附加的代码是一个容易理解的例子,总结了我的问题。如果你注释掉一个ActionPerformed方法并从main执行程序,它就可以正常工作。
不要只是在没有解释的情况下粘贴代码。
PS:我已经看到了这一点:swing progressBar threading
public class Okno {
private JProgressBar progressBar = new JProgressBar(0,306);
JFrame f = new JFrame("JProgressBar Sample");
JButton b = new JButton("start");
ActionListener a = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
barupdate();
}
};
private void barupdate(){
for(int p = 1; p<308;p=p+2){
System.out.println(p);
progressBar.setValue(p);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private Okno(){
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
progressBar.setStringPainted(true);
f.add(progressBar, BorderLayout.SOUTH);
f.add(b, BorderLayout.NORTH);
b.addActionListener(a);
f.setSize(300, 300);
f.setVisible(true);
}
public static void main(String[] args) {
Okno okno = new Okno();
}
}
这是一个非常普遍的问题,它通常以相同的方式解决,在这种情况下最好的解决方案通常使用'SwingWorker',[例如](http://stackoverflow.com/questions/12020949/jprogressbar-isnt -progressing/12021971#12021971)。您还可以查看[并发中的摆动](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)以获取有关该问题的更多详细信息。在大多数情况下,使用另一个'Thread'本身并不是最好的选择,因为Swing不是线程安全的,你必须采取额外的预防措施来更新用户界面,这是SwingWorker免费提供给你的;) – MadProgrammer
@ MadProgrammer,“在这种情况下,最好的解决方案通常是使用SwingWorker ......你应该看看Swing中的并发性,” - 希望我能想到这一点。 – camickr
@camickr这个问题应该被关闭,但是我知道你有这样的问题,所以我留下了我的评论(支持你的回答),并且离开 – MadProgrammer