2014-05-15 21 views
0

您好,我已經實現了以下方式調用後面的方法,但仍然在點擊下一個按鈕後,我無法從Close按鈕獲得響應。請指出我的代碼中有錯誤,或者請告訴我,我期望的行爲是否錯誤。swing中的invokeLater方法

public void actionPerformed(ActionEvent e) { 
//Some log messgae 
    if (e.getSource() == btnNext) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run(){ 

/// some piece of code for some database transaction 

      } 
     }); 

    } 

我期望在這裏,如果我點擊btnNExt仍然應該能夠關閉它之間的數據庫事務之間的應用程序。這沒有發生?

我在想這裏有什麼問題,或者代碼有問題。

+0

invokeLater將在swing事件線程上執行,並在運行時凍結UI。看起來你的數據庫事務代碼阻止了UI,並且應該在單獨的線程上運行。如果沒有swing代碼,請不要使用invokeLater運行它。 – schmop

+1

使用SwingWorker代替invokeLater作爲您的數據庫代碼 –

回答

0

你所期待的是錯誤的。

SwingUtilities.invokeLater不會異步啓動您的操作,它僅在返回按鈕事件處理程序(並且隊列中沒有其他EDT事件)後才啓動 - 所以基本上它會在應用程序不忙處理時啓動代碼GUI事件。

要做任何異步的事情,你需要使用一個線程。以SwingWorker類爲例。然而,我相信你的數據庫操作願意返回一些數據或者在UI上做一些事情(除非你只是從db中刪除了某些東西?)

這樣會產生另一組問題,因爲你永遠不會更新任何東西在另一個線程的GUI上。在那裏你可以調用數據庫線程的SwingUtilities.invokeAndWait來更新GUI上的某些東西。

相關問題