如何从long方法内部更新swing GUI(我希望TextArea能够立即更新)?

时间:2017-04-22 15:19:21

标签: java swing

尝试在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) {}

}

2 个答案:

答案 0 :(得分:0)

不要在侦听器中使用Thread.sleep(...)。所有侦听器代码都在Event Dispatch Thread (EDT)上执行。 GUI不能重新绘制自己,直到循环执行完毕。

解决方案是为长时间运行的任务使用单独的Thread。一种方法是使用SwingWorkder。一旦代码在单独的线程上执行,您就可以使用Thread.sleep(...)(如果需要)。

阅读Concurrency上的Swing教程中的部分,了解有关EDT和使用SwingWorker的更多信息。本教程包含一个可以帮助您入门的工作示例。

答案 1 :(得分:-1)

我认为您需要创建一个新的Thread并在那里执行10秒代码。否则,GUI将冻结而不是