在Java Swing GUI中立即输出文本的正确方法

Pau*_*aul 1 java swing doevents

这样一段代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

应该在每次调用后立即将每条消息输出到LogBox(JTextArea)log,但URL ... accepted仅在URLConnectionReader.getText(url)完成时输出.

有几种方法可以立即输出:

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

有一些简单的方法可以立即输出吗?我正在研究有关DoEvents以及如何在Java中执行此操作的问题,但我认为开始从多线程学习Java并不是一种正确的方法.

par*_*fal 5

创建一个SwingWorker进行下载:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html


a的作用ActionListener就是:监听用户操作,并通过程序启动对该操作的响应.

有时,程序的响应非常快,只涉及GUI.例如,在计算器应用程序中,您可以将侦听器附加到"等于"按钮,该按钮计算当前表达式的结果并将其写入文本框.这可以在侦听器方法中完成(尽管您可能希望将行为分开以进行测试).

如果对用户操作的响应是启动一些长时间运行的过程,例如下载和解析文件,那么您不希望在侦听器主体中执行此操作,因为它将冻结UI.相反,从侦听器中收集任何信息(在您的情况下,URL值),并启动a SwingWorker来处理程序的响应.

在我的意见,我建议之后,在移动的一切getText()SwingWorker.这是因为,对我来说,响应是"如果您有有效的URL,则下载文件,并记录进度".正如我所看到的,测试空字符串是该响应的一部分.如果你想把空字符串测试留在监听器中,那很好,但是它不太可测试.

必须将调用留在getText()侦听器的主体内部,因为您只能从事件派发线程访问Swing组件.如果将该调用移动到工作程序中,则它可能在文本框自行更新的同时访问文本框,从而导致数据损坏.