2012-07-31 26 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. 
    } 
}