I can't update my progressbar... this is my code
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 correct开发者_运维百科ly works
t.interrupt();
The progress bar state is updated only at the end of thread. Can someone help me??
Before the sleep, add a call to SwingUtilties.invokeLater() that spawns a thread to fire a firePropertyChange on the progressbar in the EDT.
Use a model instead of the JProgressBar directly:
DefaultBoundedRangeModel model = new DefaultBoundedRangeModel();
JProgressBar bar = new JProgressBar(model);
// Somewhere else, perhaps in another Thread
model.setValue(i)
The following example works fine:
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();
}
The best advice for your situation is to use SwingWorker. Check out the API at http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html
Override process method to update value of progress bar ( then it will be done correctly on EDT)
More info can be obtained at http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
Per eugener, SwingWorker
is definitely what you want to be using here, or any time a long-running task is spawned that could otherwise lock up your GUI prior to completion. A full tutorial on using progress bars with SwingWorker
is available from Sun^H^H^HOracle here:
http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html
Thanks All. I solved in this way
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
}
Putting this snippet
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jProgBar.repaint();
}
}
Between 'i++' and 'Thread.sleep()' should do the job. To get it compiling, mark jProgBar as 'final'.
精彩评论