[英]A proper way to output text immediately in Java Swing GUI
這段代碼:
private void log(String message) {
LogBox.append(message + "\n");
}
private void log(Exception e) {
log(e.getMessage());
}
private void ConvertButtonActionPerformed(java.awt.event.ActionEvent evt) {
String url = UrlBox.getText();
if (url.isEmpty()) {
log("Empty URL");
return;
}
LogBox.setText("");
try {
log("URL "+url+" accepted. Trying to download...");
String content = URLConnectionReader.getText(url);
log("Downloaded. Parsing the content...");
//
} catch (Exception e) {
log(e);
}
}
應該在每個log
調用之后立即將每個消息輸出到LogBox
( JTextArea
),但是輸出URL ... accepted
僅在URLConnectionReader.getText(url)
完成時才URL ... accepted
。
有幾種方法可以立即輸出:
有一些簡單的方法可以立即輸出嗎? 我正在研究有關DoEvents以及如何在Java中執行此操作的問題,但我認為從多線程開始學習Java是不正確的方法。
創建一個SwingWorker
來進行下載: http : //docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
ActionListener
的作用就是:偵聽用戶操作,並由程序啟動對該操作的響應。
有時,程序的響應非常快,僅涉及GUI。 例如,在計算器應用程序中,您可以將一個偵聽器附加到“等於”按鈕上,該按鈕用於計算當前表達式的結果並將其寫入文本框。 所有這些都可以在偵聽器方法中完成(盡管您可能希望將行為分開進行測試)。
如果對用戶操作的響應是啟動一些長時間運行的過程(例如下載和解析文件),則您不想在偵聽器主體中執行此操作,因為它將凍結UI。 而是從偵聽器內部收集所有信息(在您的情況下為URL值),然后旋轉SwingWorker
來處理程序的響應。
在我的評論中,我建議將getText()
之后的所有內容移動到SwingWorker
。 對我來說,這是因為響應是“如果您具有有效的URL,請下載文件並記錄進度”。 正如我所看到的,測試空字符串是該響應的一部分。 如果您想將空字符串測試留在偵聽器中,那很好,但是imo的測試性較差。
您必須將對getText()
的調用留在偵聽器的主體內,因為只允許您從事件分發線程訪問Swing組件。 如果將該呼叫移至工作程序中,則它可能會在文本框更新自身的同時訪問該文本框,從而導致數據損壞。
閱讀並發 。
您可能應該將SwingWorker
用於長時間運行的任務,然后在結果可用時publish
到GUI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.