如何让 KeyListener 使用主线程而不是 EDT?

How to get KeyListener to use main thread and not EDT?

在我的程序中,我有一个在按下某个键时调用的方法。 在某些任务完成之前,该方法不应该 return,因此它会阻塞线程,例如:

while (!taskIsDone);

和 运行 一些后台进程 javax.swing.Timer

但是,由于 KeyListener 是由事件派发线程处理的,该方法会阻塞事件派发线程,而不是主线程,如果事件派发线程正在被调用,则程序无法 运行已屏蔽。

有什么解决办法吗?

and runs some background process with javax.swing.Timer.

后台进程不应 运行 带有计时器。定时器代码在 EDT 上执行。因此,长时间的 运行ning 任务将阻止 GUI 重新绘制自身和响应事件。

启动一个单独的线程来执行您的后台任务。

最简单的方法是使用 SwingWorker.

阅读有关 Worker Thread and SwingWorker 的 Swing 教程部分,了解更多信息和工作示例。

如果您想在任务执行时阻止进一步的输入,也许您可​​以显示一个进度条,以便用户知道正在后台进行处理。