0

我有一个扩展类SwingWorker<Void, Void>。如果成功更改布局并将新面板添加到框架中,我应该在它的后台线程中进行登录。所以 Swing 工作人员执行以下 3 项任务:

  1. 登录
  2. 更改布局
  3. 添加/删除面板。

所以我在 doInBackground() 方法中编写了这个函数。但是这里发生的是这 3 个方法总是被执行,无论登录是否成功。如果登录失败,我想停止执行工作人员。我尝试了 cancel() 方法,但没有奏效。我怎样才能以正确的方式做到这一点?在 SwingWorker 中执行登录任务的正确方法是什么?

4

2 回答 2

2

第二步和第三步不能在doInBackground()方法中完成,因为它们使用 Swing 组件,因此必须在事件调度线程中完成。done()如果登录成功,它们必须在方法中完成。

所以你的 SwingWorker 应该是一个SwingWorker<Boolean, Void>. 如果登录成功,该doInBackground()方法应返回 true,否则返回 false:

SwingWorker<Boolean, Void> loginWorker = new SwingWorker<Boolean, Void>() {
    protected Boolean doInBackground() {
        return login();
    }

    protected void done() {
        try {
            boolean loginSuccessful = get();
            if (loginSuccessful) {
                updateGUI();
            }
        }
        catch (Exception e) {
            displayErrorMessage(e);
        }
    }
};
于 2012-07-31T08:37:34.777 回答
0

正如 Robin 所说,使用 return。实际上,步骤 1 应该在后台线程中完成,而步骤 2 和 3 应该在事件调度线程中完成。所以

protected Void doInBackground() {
    boolean success = login();
    this.setSuccess(success); // so that other thread knows whether you logged in
}

protected void done() {
    if (this.getSuccess()) {
//Change layout
//Add/remove panels.
    }
}
于 2012-07-31T08:36:55.037 回答