2013-04-24 131 views
0

我在Java Swing中有一個onClick事件。在java swing的onclick事件中顯示加載動畫onclick

private void fastForward(java.awt.event.MouseEvent evt) { 
    loading.setVisible(true); 
    //some time consuming algorithm 
    loading.setVisible(false);  
} 

其中,我執行一個耗費大量時間的操作,所以我想顯示一個加載動畫。

我創建了一個按鈕,帶有一個加載gif的圖標,我將該按鈕的可見性設置爲false。在onClick事件中,我將可見性設置爲true。問題是,當整個函數執行時,按鈕變得可見,這不是我想要的。我希望在執行該功能期間顯示按鈕。如何在執行過程中將按鈕設置爲可見。

+0

什麼是'onClick'事件?我不知道這個名字的Swing事件。 – camickr 2013-04-24 15:18:49

回答

4

這是因爲,只有UI線程獲得空閒後,纔可以更新UI。這就是你需要做什麼:

private void fastForward(java.awt.event.MouseEvent evt) { 
    loading.setVisible(true); 
    new Thread(new Runnable(){ 

    @Override 
    public void run(){ 
     //time consuming algorithm. 
     if(done){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override public void run(){ 
       loading.setVisible(false);  
      } 
      }); 
     } 
    } 

    }).start(); 
} 

上面發生的事情是這樣的:

  1. UI線程設置加載狀態。
  2. UI線程啓動一個新線程來執行該命令。這次調用後,UI線程是免費的。
  3. 新線程計算算法
  4. 一旦新的線程完成,它要求在UI線程更新UI

這樣,按鈕不會得到凍結。完成後,UI線程會被更新。

+0

+1仍然正確的方式 – mKorbel 2013-04-24 10:43:35

+0

+1。但我不認爲存在'SwingUtilities.runLater'。你可能意思是'SwingUtilities.invokeLater'。 – 2013-04-24 11:52:22

+1

@GuillaumePolet謝謝。更新它。我一直在使用'JavaFX'並且有'Platform.runLater()',所以寫錯了。 – Jatin 2013-04-24 11:55:54

2

嘗試使用SwingWorker

它在內置功能來重新同步與事件通過使用的publish/process方法調度線程。它很容易知道什麼時候它的done並有進度更新功能

看看thisthisthis的例子