2

我无法更新我的进度条...这是我的代码

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();

进度条状态仅在线程结束时更新。有人能帮我吗??

4

6 回答 6

4

在睡眠之前,添加对 SwingUtilties.invokeLater() 的调用,该调用会生成一个线程以在 EDT 的进度条上触发 firePropertyChange。

于 2010-07-04T12:23:38.967 回答
3

直接使用模型而不是 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();
}
于 2010-07-04T18:53:02.273 回答
1

对于您的情况,最好的建议是使用SwingWorker在http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html查看 API

覆盖处理方法以更新进度条的值(然后它将在 EDT 上正确完成)

更多信息可在http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html获得

于 2010-07-04T18:52:28.740 回答
1

Per eugener,SwingWorker绝对是你想要在这里使用的,或者任何时候产生一个长时间运行的任务,否则可能会在完成之前锁定你的 GUI。SwingWorkerSun^H^H^HOracle 提供了有关使用进度条的完整教程:

http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html

于 2010-07-04T19:05:56.703 回答
1

谢谢大家。我是这样解决的

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
   }
于 2010-07-08T23:50:48.450 回答
0

把这个片段

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        jProgBar.repaint();
    }
}

在“i++”和“Thread.sleep()”之间应该可以完成这项工作。要编译它,请将 jProgBar 标记为“final”。

于 2010-07-06T12:21:52.673 回答