2017-10-12 264 views
2

我知道很多人之前都問過這個問題,但我找不到任何解決我的問題的答案。我的代碼是這樣的:JLabel的值沒有使用Java中的setText()更新

public void mouseClicked(MouseEvent arg0) { 
    TEXT.setText("ON"); 
    myfunction(); //runs for a very long time 
} 

JLabel的原文是"OFF"。現在我想點擊鼠標時,但文字不設置當文本更改爲"ON",直到myfunction()完成(這可能需要幾分鐘)。

我已經嘗試了無效函數,使設置文本的單獨函數,但沒有任何工作。

請幫我解決這個問題!

+1

如果可能的話,你必須在單獨的線程中運行myfunction() 。 myfunction()做什麼? –

+0

它通過以太網獲取數據並將其添加到數據庫。我想避免線程... – KulaDamian

+0

有沒有辦法繞過線程。用swing編寫好的代碼總是會以某種形式使用線程。閱讀我的答案,我詳細解釋它。 –

回答

2

問題是mouseClicked(...)UI Thread上執行。這是Thread,負責處理各種用戶操作(如鼠標單擊)及零部件的圖紙(如更新屏幕上的標籤的文本)。如果您在UI線程上執行長時間運行的方法調用,它將被阻止,並且在執行完成之前無法繪製任何內容。您必須使用multi threading來解決此問題。

下可能不是最完美的解決方案,但如果你是新的多線程它會完成這項工作:

public void mouseClicked(MouseEvent arg0) { 
    TEXT.setText("ON"); 
    (new Thread() { 
     public void run() { 
      myfunction(); 
     } 
    }).start(); 
} 

這將產生一個新的Thread來處理你的方法,這將讓UI Thread繼續做它的事情。考慮取消激活剛剛被點擊的按鈕,這樣用戶就不能在正在執行的時候開始執行(這通常是你想要的)。