JButton Action Listener进度条,更新没有冻结?

时间:2013-09-01 21:15:12

标签: java swing swingworker jprogressbar

我有一个进度条,当我按下按钮时,按钮监听器上我有一个进度条,可以下载更新。但是,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?!

2 个答案:

答案 0 :(得分:3)

使用SwingWorker在另一个线程中执行下载。 Here您有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());
        }         
      }
     }

答案 1 :(得分:0)

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

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