[英]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.