[英]Update JProgressBar
我无法更新我的进度条...这是我的代码
Thread t=new Thread(new Runnable(){
public void run(){
int i=1;
jProgBar.setMinimum(0);
jProgBar.setMaximum(100);
try {
while(i<=100 || true){
jProgBar.setValue(i);
i++;
Thread.sleep(50);
}
}
catch (InterruptedException ex){
jProgBar.setValue(jProgBar.getMaximum());
}
}
});
t.start();
.... Something code that correctly works
t.interrupt();
进度条状态仅在线程结束时更新。 有人能帮我吗??
在睡眠之前,添加对SwingUtilties.invokeLater()的调用,该调用产生一个线程以在EDT中的进度条上触发firePropertyChange。
直接使用模型而不是JProgressBar:
DefaultBoundedRangeModel model = new DefaultBoundedRangeModel();
JProgressBar bar = new JProgressBar(model);
// Somewhere else, perhaps in another Thread
model.setValue(i)
以下示例正常工作:
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 100);
frame.setVisible(true);
final DefaultBoundedRangeModel model = new DefaultBoundedRangeModel();
frame.add(new JProgressBar(model));
Thread t = new Thread(new Runnable() {
public void run() {
int i = 1;
model.setMinimum(0);
model.setMaximum(100);
try {
while (i <= 100 || true) {
model.setValue(i);
i++;
Thread.sleep(50);
}
} catch (InterruptedException ex) {
model.setValue(model.getMaximum());
}
}
});
t.start();
Thread.sleep(2000);
t.interrupt();
}
对您的情况最好的建议是使用SwingWorker 。 查看API, 网址为http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html
覆盖进程方法以更新进度条的值(然后它将在EDT上正确完成)
有关更多信息,请访问http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
对于eugener来说, SwingWorker
绝对是您想要在这里使用的,或者任何时候产生长时间运行的任务,否则可能会在完成之前锁定您的GUI。 Sun ^ H ^ H ^ HOracle提供了有关使用SwingWorker
进度条的完整教程:
http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html
谢谢大家。 我这样解决了
try{
jProgBar.setIndeterminate(true);
jProgBar.setStringPainted(true);
jProgBar.setBorderPainted(true);
new Thread(new Runnable() {
public void run() {
...
// here is code that i've to wait
// after this i stop my jProgressBar
...
jProgBar.setStringPainted(false);
jProgBar.setBorderPainted(true);
jProgBar.setIndeterminate(false);
}
}).start();
}
catch(IllegalStateException ex){
//some code
}
把这个片段
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jProgBar.repaint();
}
}
在'i ++'和'Thread.sleep()'之间应该完成这项工作。 要进行编译,请将jProgBar标记为“final”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.