-1

我有一个进度条,当我按下按钮时,在按钮侦听器上我有一个进度条,它会随着下载内容而更新。但是,GUI 会冻结,直到下载完成。随着下载的继续,我怎样才能让这个进度条更新?但是,如果在没有用户干预的情况下编译应用程序时开始下载,则下载会随着进度条的更新而进行。然而,它与 JButton 动作监听器完全相反。

我怎样才能使用 SwingWorker 让它工作?

while((i=in.read(data,0,1024))>=0)
                    {
                    totalDataRead=totalDataRead+i;
                    bout.write(data,0,i);
                    float Percent=(totalDataRead*100)/filesize;
                    currentProgress.setValue((int)Percent);

                    float allP = Percent / 5;
                    all.setValue((int)allP);

                    }

这只是循环(没有catchException),我怎么可能在按钮监听器之后让GUI在下载时更新?!

4

2 回答 2

3

使用 . 在另一个线程中执行下载SwingWorker在这里,您有一个我非常喜欢的完整示例progressBar,请参阅setProgress() publish()process()。当你使用setProgress()它是一个绑定属性时,你可以采用观察者模式的方法,你可以注册一个监听器,然后当这个方法被调用时,你会捕获并更新你的progressBar组件,你也可以解耦组件。

例子:

public class MyWorker extends SwingWorker<Integer, String> {

  @Override
  protected Integer doInBackground() throws Exception {
    // Start
    publish("Start Download");
    setProgress(1);

    // More work was done
    publish("More work was done");
    setProgress(10);

    // Complete
    publish("Complete");
    setProgress(100);
    return 1;
  }

  @Override
  protected void process(List< String> chunks) {
    // Messages received from the doInBackground() (when invoking the publish() method)
  }
}

在客户端代码中:

    SwingWorker worker = new MyWorker();
    worker.addPropertyChangeListener(new MyProgressListener());
    worker.execute();

   class MyProgressListener implements PropertyChangeListener {
      @Override
      public void propertyChange(final PropertyChangeEvent event) {
        if(event.getPropertyName().equalsIgnoreCase("progress")) {
          downloadProgressBar.setIndeterminate(false);
          downloadProgressBar.setValue((Integer) event.getNewValue());
        }         
      }
     }
于 2013-09-01T21:19:41.510 回答
0

SwingWorker 是这样做的方法:http: //java.dzone.com/articles/multi-threading-java-swing但是,使用它非常棘手。

另一种选择是一个非常小的框架,称为 Foxtrot: http: //foxtrot.sourceforge.net/docs/

于 2013-09-01T21:25:55.960 回答