尝试在NetBeans中开发一个简单的GUI应用程序。
我想创建某种GUI日志记录系统,将应用程序正在执行的当前操作写入TextArea。
作为一个简单的例子,我创建了一个只包含2个对象的JFrame表单:a" Start"按钮和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) {}
}
答案 0 :(得分:0)
不要在侦听器中使用Thread.sleep(...)。所有侦听器代码都在Event Dispatch Thread (EDT)
上执行。 GUI不能重新绘制自己,直到循环执行完毕。
解决方案是为长时间运行的任务使用单独的Thread
。一种方法是使用SwingWorkder
。一旦代码在单独的线程上执行,您就可以使用Thread.sleep(...)(如果需要)。
阅读Concurrency上的Swing教程中的部分,了解有关EDT
和使用SwingWorker
的更多信息。本教程包含一个可以帮助您入门的工作示例。
答案 1 :(得分:-1)
我认为您需要创建一个新的Thread并在那里执行10秒代码。否则,GUI将冻结而不是