为什么我的GUI在SwingWorker线程运行时没有响应?

Sta*_*chy 1 java user-interface swing swingworker

我有一个带有IOBound任务的SwingWorker线程,它在运行时完全锁定了界面.更换计数器循环的正常工作负载具有相同的结果.SwingWorker看起来基本上是这样的:

public class BackupWorker extends SwingWorker<String, String> {

private static String uname = null;
private static String pass = null;
private static String filename = null;
static String status = null;

BackupWorker (String uname, String pass, String filename) {
    this.uname = uname;
    this.pass = pass;
    this.filename = filename;
}

@Override
protected String doInBackground() throws Exception {
            BackupObject bak = newBackupObject(uname,pass,filename);
    return "Done!";
}
Run Code Online (Sandbox Code Playgroud)

}

启动它的代码存在于扩展JFrame的类中:

    public void actionPerformed(ActionEvent event) {
    String cmd = event.getActionCommand();

    if (BACKUP.equals(cmd)) { 
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {

                final StatusFrame statusFrame = new StatusFrame();
                statusFrame.setVisible(true);

                SwingUtilities.invokeLater(new Runnable() {
                    public void run () {
                        statusFrame.beginBackup(uname,pass,filename);
                    }
                });
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这是StatusFrame的有趣部分:

public void beginBackup(final String uname, final String pass, final String filename) {
    worker = new BackupWorker(uname, pass, filename);
    worker.execute();

    try {
        System.out.println(worker.get());
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

据我所知,"长时间运行"的所有内容都由工作人员处理,并且触及EDT上的GUI.我是否在某处纠结过某些事情,或者我对SwingWorker的期望过高?

Ash*_*Ash 6

我认为问题是由于SwingWorker.get()您的beginBackup方法中的调用.看一下这个方法文档:

如果需要等待计算完成,然后检索其结果.

这是一个阻塞调用,因此您的GUI变得无法响应.

(此外,有没有你为什么这样做的任何特别的原因,invokeLater从内invokeLater?你已经在运行EDT电话.)