我是Swing的新手,目前正在尝试在NetBeans中开发一个简单的GUI应用程序.
我想创建某种GUI日志记录系统,将应用程序正在执行的当前操作写入TextArea.
举个简单的例子,我创建了一个只包含2个对象的JFrame表单:一个"开始"按钮和一个TextArea.
当按下"开始"按钮时,它会调用某种冗长的方法,该方法需要一些时间(比方说,10秒)才能完成运行,并且在此方法运行时,我想将文本追加到TextArea中冗长的方法(当然我希望TextArea能够立即更新).
我的问题是我无法找到正确的方法.无论如何我尝试这样做,当我按下"开始"按钮时,应用程序冻结了10秒钟,没有像我想要的那样更新TextArea.只有在方法完成后,我才会看到TextArea的更新.
这是一个示例代码:
private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
for (int i = 0; i < 10; i++) {
textArea.setText(i + "\n");
Thread.sleep(1000);
}
} catch (Exception e) {}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我希望看到的是,一旦我单击按钮,在接下来的10秒内,每隔一秒就会在TextArea上附加一行,如下所示:
1
2
3
4
...
但是我从这段代码得到的真实结果是应用程序冻结了10秒钟,最后TextArea被更新并仅显示数字9.
我已经尝试了许多不同的方法,主要使用SwingUtilities.invokeLater和SwingWorker方法,但它们都不适合我.
任何帮助找到正确的方法,将不胜感激.
java user-interface swing multithreading event-dispatch-thread