您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

防止在调用SwingWorker.get()时冻结GUI

防止在调用SwingWorker.get()时冻结GUI

get()就像join()它会一直阻塞直到被调用一样,并且会等待SwingWorker完成之后才被调用错误地使用它可以完全抵消使用SwingWorker的所有优势。

解决方案:在get()知道SwingWorker已完成处理之前,不要调用它,done()方法是在SwingWorker的方法调用它,或者如果需要从调用代码调用它,则在已添加到SwingWorker的Propertychangelistener中当SwingWorker的“状态”属性为SwingWorker.StateValue.DONE时。

就像是:

  final FileLoader loader = new FileLoader(filePath);

  loader.addPropertychangelistener(new Propertychangelistener() {
     @Override
     public void propertyChange(PropertyChangeEvent evt) {
        if ("state".equals(evt.getPropertyName())) {
           // since DONE is enum, no need for equals(...) method
           if (evt.getNewValue() == SwingWorker.StateValue.DONE) {
              try {
                 loader.get();
              } catch (InterruptedException e) {
                 e.printStackTrace();
              } catch (ExecutionException e) {
                 e.printStackTrace();
              }
           }
        }
     }
  });

  new ProgressWindow(loader, "Loading File", "Loading File");

注意:未经编译或测试的代码

编辑:尝试/捕获添加

其他 2022/1/1 18:30:35 有519人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶