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 被调用时,它不是在循环的每次迭代后更新文本区域,而是在任务的所有运行完成后才更新文本。为什么会发生这种情况,我该如何解决?
您可能正在使用 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)