2011-09-12 49 views
3

IM從按鈕調用invokeLater的direcly上的actionPerformed與此代碼:搖擺的invokeLater凍結

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      int temp = (jComboBox1.getSelectedIndex() + 1); 
     heavyProccesingFunction(); 
     } 
    }); 
} 

和仍然凍結GUI。爲什麼?沒有使用invokelater函數,我得到相同的結果。

我應該使用

Thread queryThread = new Thread() { 
     public void run() { 

呢?

編輯:

謝謝,應該使用新的線程。

+0

「如果從事件派發線程調用invokeLater - 例如,從JButton的ActionListener中調用 - doRun.run()將被推遲到所有待處理事件處理完成之前請注意,如果doRun.run )拋出一個未捕獲的異常,事件分派線程將退出(而不是當前線程)。「 http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/SwingUtilities.html#invokeLater%28java.lang.Runnable%29 –

回答

5

invokeLater仍然最終會在調度程序線程上運行代碼 - 稍後。 invokeLater的目的是允許背景線程在事件分派器線程上發佈工作。

聽起來好像你應該創建另一個線程 - 或者使用線程池來達到同樣的效果,或者例如SwingWorker。不管你做什麼,你都需要避免在事件分派器線程上運行緩慢的方法。