2012-06-29 48 views
1

我有一個登錄屏幕的GUI。每當我按下登錄按鈕的用戶名和密碼是針對在線mysql數據庫中的條目進行檢查時,我從登錄按鈕的actionPerformed()方法中的數據庫中提取所有這些信息。問題是當程序從數據庫中提取數據時GUI凍結。我GOOGLE了我的問題,發現我應該使用SwingWorker,但作爲一個新手,我沒有得到如何使用SwingWorker爲我的目的。使用SwingWorker在後臺執行復雜的任務

回答

2

首先,在你的類聲明一個成員變量(它可能是在你的GUI類)SwingWorker類型的這樣的:

private SwingWorker<Boolean, Void> backgroundProcess; 

然後在初始化代碼中初始化變量(構造,昂秀方法事件處理等),就像這樣:

backgroundProcess = new SwingWorker<Boolean, Void>() { 

     @Override 
     protected Boolean doInBackground() throws Exception { 
      // paste the MySQL code stuff here 
     } 

     @Override 
     protected void done() { 
      // Process ended, mark some ended flag here 
      // or show result dialog, messageBox, etc  
     } 
    }; 

然後,在你actionPerfomed方法,調用SwingWorker的執行方法:

backgroundProcess.execute(); 

如果做得正確,則GUI不應該在按鈕按下事件

+0

+1有幫助的提綱,但我不明白使用'布爾'。 「連接」或「數據源」不會更合適。 – trashgod

+0

真的很清楚答案。 +1。 – m4heshd

1

這個簡單的exampleextends SwingWorker<Icon, Void>IconVoid中間結果。同樣,您可能會延伸SwingWorker<DataSource, Void>以獲取DataSource

+0

你的意思是我要取的doInBackground從DB數據()方法,並調用execute()方法時,用戶點擊後freezee登錄按鈕。 – kaysush

+0

是的; 'done()'在EDT上執行,因此,一旦獲得連接,您可以更新GUI, – trashgod

+0

如何在done()方法中從doInBackground()返回值? 我想顯示一個新的JFrame,如果它恢復爲真,並顯示錯誤消息,如果它返回false.Do我需要另一個EDT完成顯示新幀? – kaysush