有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing在Java中等待线程完成

我有一些代码在一个单独的线程中执行下载,创建这些代码是为了让JFrame GUI在下载过程中继续更新。但是,当我使用线程时,目的完全失败了。join(),因为它会导致GUI停止更新。我需要一种方法来等待线程完成,并且仍然更新GUI


共 (1) 个答案

  1. # 1 楼答案

    您可以让下载任务同时向GUI触发事件

    例如:

    Runnable task = new Runnable() {
       public void run() {
          // do your download
    
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                // call some method to tell the GUI that the download finished.
             }
          });
       }
    };
    

    然后要运行它,可以使用Executor(首选方法)或原始线程:

    executor.execute(task);
    

    或者

    new Thread(task).start();
    

    正如评论中所指出的,你通常会使用SwingWorker来做这类事情,但你也可以使用上面概述的手动方法

    SwingWorker提供了一个doInBackground方法,您可以在其中插入下载逻辑;提供了一个done方法,您可以在其中插入代码,通知GUI下载已完成;提供了一个get方法,可以获得doInBackground的结果(如果有)

    例如

    class Downloader extends SwingWorker<Object, Object> {
       @Override
       public Object doInBackground() {
           return doDownload();
       }
    
       @Override
       protected void done() {
           try { 
             frame.downloadDone(get());
           } catch (Exception ignore) {
           }
       }
    }
    
    (new Downloader()).execute();