2012-07-31 27 views
0

我有一个课程延伸SwingWorker<Void, Void>。在后台线程中,我应该做登录,如果成功更改布局并添加新面板到框架。所以摇摆工人做以下3项任务:登录SwingWorker

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

所以我在doInBackground()方法中写了这个函数。但是这里发生的是这3个方法总是被执行,不管登录是否成功。如果登录失败,我想停止执行worker。我试过取消()方法,但它没有奏效。我怎样才能以适当的方式做到这一点? 在SwingWorker中执行登录任务的正确方法是什么?

+0

使用'回报;'如果你想跳出的方法(用作任何其他无效的方法) – Robin 2012-07-31 08:21:01

+0

你也可以查看登录是否成功(或者登录是否已经发生),然后执行步骤2和3. – Thomas 2012-07-31 08:22:00

+0

@Thomas您是指在登录方法中返回true/false并在执行2和3步骤之前放置if条件? – 2012-07-31 08:29:34

回答

2

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

所以你的SwingWorker应该是SwingWorker<Boolean, Void>。该doInBackground()方法应该返回true,如果登录成功,假如果不是:

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); 
     } 
    } 
}; 
+0

我可以做同样的事情,我的意思是get()方法,在这个类之外,我称之为execute()?因为updateGui方法耗时,我还必须连接到服务器以获取要显示的细节。 – 2012-07-31 08:46:39

+0

使用后执行挂起用户界面,所以它似乎我不能使用它。我还能做什么?我真正想要的是我已将一个进度条与此任务相关联,因此它应按照已完成的步骤进行。如果我在done方法中执行了所有updateGUI,它将无法正常运行,但我无法在UI上看到所有的表单服务器值。 – 2012-07-31 09:03:20

+0

好吧,它现在的作品。谢谢 :) – 2012-07-31 09:08:05

0

正如罗宾所说,使用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. 
    } 
}