当按下JButton时,My Swing应用程序将文本行打印到JScrollPane内部的JTextPane。快速操作没有问题。但是,一些JButton会调用可能需要几分钟的操作。在此期间,按钮保持灰色。JTextPane活跃
目前发生的情况是,文本是“批处理”,然后在操作结束时我同时得到数百行文本,同时按钮变得非灰色。问题是,我希望文本被附加到JTextPane中显示的文档上,以便在整个操作完成时更早出现(在附加时)。这将创造更好的用户体验。
我在做什么错?
当按下JButton时,My Swing应用程序将文本行打印到JScrollPane内部的JTextPane。快速操作没有问题。但是,一些JButton会调用可能需要几分钟的操作。在此期间,按钮保持灰色。JTextPane活跃
目前发生的情况是,文本是“批处理”,然后在操作结束时我同时得到数百行文本,同时按钮变得非灰色。问题是,我希望文本被附加到JTextPane中显示的文档上,以便在整个操作完成时更早出现(在附加时)。这将创造更好的用户体验。
我在做什么错?
使用SwingWorker来执行后台操作。
// Your button handler
public void actionPerformed(ActionEvent e) {
(new SwingWorker<Void, String>() {
public Void doInBackground() {
// perform your operation
// invoke publish("your string");
}
protected void process(List<String> chunks) {
// append your string to the scroll pane
}
}).execute();
}
您正在从阻止每个事件的AWT线程中直接调用代码。解决方法是将您的长期运行代码放在单独的Thread
中。随着您的代码被执行并获得结果,您将通知您(使用观察者/可观察模式)的视图。当您的视图被通知时,您将更新滚动窗格内容。
您还必须验证您是否在AWT线程中运行(SwingUtilities.isEventDispatchThread()
)。如果您不是,那么您需要使用SwingUtilities.invokeLater()
在AWT线程中发送视图的更新,因为Swing不是线程安全的。
你是在UI线程中执行非UI相关的计算。它可以使用'SwingWorker'修复,如Oracle教程中所解释的:http://java.sun.com/developer/technicalArticles/javase/swingworker/ – 2012-02-10 08:02:21