我遇到一个JButton
名为saveChanges
的问题,在按下时会长时间专注,并且我不确定为什么会发生这种情况。以下是我的代码的摘录:
saveChanges.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveChanges.setFocusPainted(false);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
// execute some code which inserts records into a database
setCursor(Cursor.getDefaultCursor());
}
}
此方法中的代码执行大约需要5-10秒,但由于某种原因,在saveChanges
按钮返回非聚焦状态前几秒,光标将返回默认光标状态,我可以&#39 ;弄清楚原因。任何帮助将不胜感激!
答案 0 :(得分:3)
Swing是一个单线程环境,任何阻止事件调度线程的东西,由Swing用来处理新事件,包括重绘请求,都会导致UI看起来像被冻结,因为它是。
有关详细信息,请查看Concurrency in Swing。
同样,Swing不是线程安全的,这意味着必须在EDT的上下文中对UI进行任何更新。
您可以使用SwingWorker
在后台执行长时间运行的过程(来自其doInBackground
方法)并通过覆盖它来更新UI的状态done
方法,一旦doInBackground
方法退出,就会在EDT的上下文中调用。
答案 1 :(得分:0)
非GUI进程应在与事件调度线程(EDT)不同的线程上执行。使用SwingWorker来处理这些操作。