2012-05-15 32 views
0

我想以JTextField中的註釋形式向用戶顯示程序流。僅顯示最後一條消息(「完整」)。當我撥打setText()時,如何讓每條信息都顯示出來?只有最後一次對TextField的調用會更新它

private class CalculateButtonHandler implements ActionListener { 
    public void actionPerformed(ActionEvent e) {    
     String keyValue = keywordTF.getText(); 
     currentTF.setText("calling 1"); 
     methodCall1(); 
     currentTF.setText("calling 2"); 
     methodCall2(); 
     currentTF.setText("calling 3"); 
     methodCall3(); 
     currentTF.setText("complete"); 
    } 
} 

回答

2

原因是自從您的methodCall*方法在EDT上運行以來,EDT沒有時間重新繪製文本字段。

如果要顯示繁重任務的進度,您應該在工作線程上執行繁重的工作並更新EDT上的UI。通常這是通過使用工作線程中的SwingWorker或使用SwingUtilities#invokeLater來實現的。

'Concurrency in Swing'教程包含更多信息

+0

這個任務根本不重。它只是分解成更小的方法。我只想在Textfield中顯示「此方法現在」。有沒有更簡單的選擇?我不想介紹線程。謝謝!! – ArpitM

+1

@ user396501如果這些內容真的很小,即使您將它分割,文本的更新也會很快發生,您永遠無法看到它。您可以按照Ben Lawry的建議追加文本iso替換。而且要清楚,我的意思是指所有持續時間超過100ms的計算,而不僅僅是需要幾分鐘時間才能完成的計算 – Robin

+0

由於它在EDT內執行計算,這意味着UI無法更新,因爲它的重要性在於它正在忙於執行您的方法調用的工作。當您的方法調用完成時,UI將自行更新,但到那時爲時已晚。 – CodeBlind

0

嘗試:

String keyValue = keywordTF.getText(); 

currentTF.setText("calling 1"); 
methodCall1(); 
currentTF.setText(currentTF.getText()+"\ncalling 2"); 
methodCall2(); 
currentTF.setText(currentTF.getText()+"\ncalling 3"); 
methodCall3(); 
currentTF.setText(currentTF.getText()+"\ncomplete"); 

並不十分有效,但它會完成這項工作。

此外

它會是好了很多使用JTextAreaJTextField主要用於顯示一行文字,但聽起來你想保留更多的日誌...也許?如果您仍想使用JTextField,請用其他適當的分隔符替換setText()調用中的「\ n」字符。

+0

我將其更改爲JTextArea。現在,所有的「call 1」,「call 2」等語句都會在最後一次出現,即只在Java應用程序的終止處。所有搞砸了!任何幫助?謝謝!! – ArpitM

+0

啊哈,現在有道理 - 當我最初發布我的答案時,你的代碼沒有顯示你在'actionPerformed(ActionEvent ae)'實現中進行了調用。 @Robin正確地說,直到方法調用完成之前你沒有看到任何更新的原因是因爲你正在執行事件調度線程中的計算。如果您想在這些方法運行時更新UI,則需要在另一個線程中運行這些方法。 – CodeBlind

相關問題