当按下JButton时,My Swing应用程序将文本行打印到JScrollPane内的JTextPane。为了快速操作,没有问题。但是,一些JButton会调用可能需要几分钟的操作。在此期间,按钮保持灰色。
当前发生的事情是文本被“批处理”,然后在操作结束时我同时获得数百行,同时按钮变为非灰色。问题是我希望附加到JTextPane中显示的文档的文本更早出现(在附加时),而不是整个操作完成时。这将创造更好的用户体验。
我做错了什么?
答案 0 :(得分:2)
使用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();
}
答案 1 :(得分:1)
您正在直接从AWT-Thread中调用代码来阻止每个事件。解决方案是将长时间运行的代码放在单独的Thread
中。当您的代码被执行并获得结果时,您需要通知您的视图(使用观察者/可观察模式)。当您的视图得到通知时,您将更新滚动窗格内容。
您还必须验证您是否在AWT-Thread中运行(SwingUtilities.isEventDispatchThread()
)。如果不是,则需要使用SwingUtilities.invokeLater()
在AWT-Thread中调度视图的更新,因为Swing不是线程安全的。