为什么我的 JTextArea 没有更新?

Mac*_*cha 5 java concurrency swing jtextarea event-dispatch-thread

我有如下代码:

class SimplifiedClass extends JApplet {

    private JTextArea outputText;
    // Lots of methods
    public void DoEverything() {
        String output = "";
        for(int i = 0; i <= 10; i++) {
            output += TaskObject.someLongTask(i);
            outputText.setText(output);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当 setText 被调用时,它不是在循环的每次迭代后更新文本区域,而是在任务的所有运行完成后才更新文本。为什么会发生这种情况,我该如何解决?

Mik*_*nen 2

您可能正在使用 Swing 线程,该线程正在等待代码执行,然后才能更新 UI。尝试为该循环使用单独的线程。

public void DoEverything() {
  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      String output = "";
      for(int i = 0; i <= 10; i++) {
        output += TaskObject.someLongTask(i);
        outputText.setText(output);
      }
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

  • -1 该代码片段如何成为循环的单独“线程”。现在您要确保它在 EDT 上执行 (2认同)