我目前正在学习Swing,而且我是GUI开发的新手。在我的测试应用程序中,我有一个单个事件源的多个事件列表器,我想知道这些事件监听器中的哪一个将首先被激活。
另外,我很想知道Swing事件处理在单线程环境中是如何工作的,特别是当你有一个单个事件源的多个监听器时。
最后,我想知道一些常见的情况,我必须在Swing中使用多个线程。
谢谢!
答案 0 :(得分:12)
我会尝试回答你的所有3个问题。首先,没有指定ActionListener
s fire的顺序。人们不应该假设他们会触发特定的命令。如果您需要按特定顺序执行操作,请将它们放在相同的ActionListener
。
编写Swing时,您“几乎”总是处于多线程环境中。有一个称为事件调度线程(EDT)的线程。这是处理所有事件的线程。您执行的任何其他处理都应该在不同的线程上完成,否则您的Swing GUI可能会无响应。
Swing中多线程的常见情况是,您需要进行一些需要较长时间的处理。 (强烈的计算,IO,数据库连接)您将希望在与EDT的单独线程上进行艰苦的工作。这将使您的GUI保持响应。
Oracle网络在Swing中提供了一个很好的并发教程。我建议你check it out。
Swing程序员处理以下类型的线程:
- 初始线程,执行初始应用程序代码的线程。
- 事件调度线程,其中执行所有事件处理代码。大多数与Swing框架交互的代码也必须在此线程上执行。
- 工作线程,也称为后台线程,执行耗时的后台任务。
Swing中任何多线程问题的规范答案是使用SwingWorker
。它允许您在与EDT的单独线程上轻松协调后台工作。像往常一样,Oracle有一个great tutorial on how to use SwingWorker
。