Java Swing中单线程环境下为单个事件源添加多个事件监听器

7

我目前正在学习Swing,对于GUI开发还比较新手。在我的测试应用程序中,我有多个事件监听器针对单个事件源,我想知道哪一个事件监听器会首先执行。

此外,我很想了解在单线程环境下Swing事件处理的工作原理,特别是当您为单个事件源拥有多个监听器时。

最后,我想知道在Swing中需要使用多个线程的一些常见情况。

谢谢!

1个回答

13
我将尝试回答你的三个问题。首先,不指定ActionListener的触发顺序。永远不应该假设它们将以特定的顺序触发。如果需要按特定顺序执行操作,请将它们放在同一个ActionListener中。
当编写Swing程序时,几乎总是处于多线程环境中。有一个称为事件分派线程(EDT)的线程。这是处理所有事件的线程。您进行的任何其他处理都应该在不同的线程上完成,否则您的Swing GUI可能会变得无响应。
Swing中多个线程的常见情况是任何时候需要执行需要较长时间的某些处理(强烈的计算、IO、数据库连接)。您将希望在EDT之外的单独线程上完成艰苦的工作。这将使您的GUI保持响应。
Oracle网络上有一份关于Swing并发的很棒的教程。我建议你去查看
引用块: Swing程序员处理以下类型的线程: - 初始线程,执行初始应用程序代码的线程。 - 事件分派线程,执行所有事件处理代码的线程。大多数与Swing框架交互的代码也必须在此线程上执行。 - 工作线程,也称为后台线程,执行耗时的后台任务。
任何关于Swing中多线程问题的规范答案是使用SwingWorker。它允许您轻松地在单独的线程上协调后台工作和EDT。像往常一样,Oracle有一个非常好的教程,介绍如何使用SwingWorker

1
除了没有直接提到SwingWorker,其他方面都是非常好的答案。 - extraneon
@extraneon:是的,SwingWorker 是 Swing 中多线程的典型答案。我会在最后快速地提一下它。 - jjnguy
2
从设计角度来看,可以创建一个ActionListener,您可以向其注册其他ActionListeners(或另一个类),它们可以按照设置的顺序执行。 - extraneon
@extra: 您可以设计代码以按特定顺序执行“ActionListeners”。但是一般来说,核心Swing不指定顺序。 - jjnguy
1
@jjnguy 感谢您解释得这么清楚...!! - Luffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接