簡體   English   中英

在Java Swing GUI中立即輸出文本的正確方法

[英]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調用之后立即將每個消息輸出到LogBoxJTextArea ),但是輸出URL ... accepted僅在URLConnectionReader.getText(url)完成時才URL ... accepted

有幾種方法可以立即輸出:

  • Visual Basic 6和.NET中的Application.DoEvents
  • Delphi中的Application.ProcessMessages

有一些簡單的方法可以立即輸出嗎? 我正在研究有關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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM