`
abian
  • 浏览: 9787 次
社区版块
存档分类
最新评论

Swing EDT

阅读更多

Swing 的线程策略

总结一句话:对Swing所有组件和model(模型)的更改 必须至于EDT 事件派发线程中.

 

通常 Swing 不是线程安全的。除非另行说明,否则所有 Swing 组件及相关类都必须在事件调度线程上访问。

典型的 Swing 应用程序执行处理以响应用户动作所生成的事件。例如,单击 JButton 通知所有添加到 JButtonActionListener。由于用户动作所生成的所有事件都在调度线程上指派,所以大部分开发人员不受该限制的影响。

但是,影响存在于构造以及显示 Swing 的应用程序中。对应用程序的 main 方法或 Applet 中方法的调用不在事件调度线程上调用。因此,构造和显示应用程序或 applet 时,必须注意要将控件转移到事件调度线程。转移控件和开始处理 Swing 的首选方法是使用 invokeLaterinvokeLater 方法安排 Runnable 在事件调度线程上处理。以下两个示例都同样很好地用于转移控件和启动 Swing 应用程序:

public class MyApp implements Runnable {
    public void run() {
        // Invoked on the event dispatching thread.
        // Construct and show GUI.
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new MyApp(args));
    }
}

或:

public class MyApp {
    MyApp(String[] args) {
        // Invoked on the event dispatching thread. Do any initialization
        // here.
    }

    public void show() {
        // Show the UI.
    }

    public static void main(final String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MyApp(args).show();
            }
        });
    }
}

此限制也适用于连接到 Swing 组件的模型。例如,如果将 TableModel 连接到 JTable,则 TableModel 应该只在事件调度线程上进行修改。如果修改单独线程上的模型,就有遭遇异常和可能的显示损坏的风险。

由于所有事件都是在事件调度线程上传递的,所以必须注意事件处理。尤其是,在事件调度线程上执行的长运行时间任务(如网络 io 或计算密集处理)将阻塞事件调度线程调度任何其他线程。事件调度线程受阻塞时,应用程序对用户输入完全没有反应。有关处理 Swing 时执行这种处理的首选方式,请参阅 SwingWorker

分享到:
评论

相关推荐

    Swing速度慢和反映迟钝原因

    - **多线程利用不足**:由于Swing组件的更新必须在EDT中进行,因此如果不合理地管理耗时任务,会严重影响界面的流畅性。合理地使用多线程技术可以在很大程度上避免这一问题。 #### 解决方案 为了提高Swing应用程序...

    AWT与Swing使用区别

    - **线程操作**:对Swing组件的线程操作需要特别注意,避免在非EDT中直接修改组件状态,应使用`SwingUtilities.invokeLater()`或`invokeAndWait()`来确保操作在EDT中执行。 - **顶级容器**:建议在Swing应用中使用...

    90个java-swing基础例子.zip

    10. **线程管理**:Swing不是线程安全的,所有对Swing组件的修改应在Event Dispatch Thread (EDT)中进行,以避免并发问题。 通过这90个基础例子,你可以逐步了解和掌握如何使用Swing创建组件,布局组件,处理用户...

    javaSwing皮肤大全.rar

    3. 更改LookAndFeel可能会引发UI组件的重新布局,因此在切换皮肤时,应在事件调度线程(Event Dispatch Thread, EDT)中进行。 4. 测试皮肤在不同操作系统和屏幕分辨率下的表现,确保兼容性和可读性。 总之,“java...

    Java Swing桌面开发经典案例

    9. **多线程**:Swing应用程序通常在Event Dispatch Thread(EDT)中运行,理解并发编程对于避免线程安全问题至关重要。 10. **Swing utilities**:如SwingUtilities.invokeLater()用于确保代码在EDT中执行,以及...

    fest-swing文档

    由于Swing是单线程模型,测试时需要确保所有UI操作都在Event Dispatch Thread(EDT)上执行。文档会讲解如何使用`invokeAndWait()`和`invokeLater()`方法来正确处理这一点。 文档中还可能包含关于模拟用户输入和...

    Java Swing 2nd Edition

    因此,书中可能详细阐述了Event Dispatch Thread(EDT)的概念,它是Swing执行所有界面更新的单线程,以确保界面操作的同步性和一致性。 最后,作为一本2nd Edition的书籍,作者很可能也讨论了Swing的最新改进和...

    几个swing多线程的例子

    然而,由于 Swing 组件默认在主线程(Event Dispatch Thread, EDT)中运行,如果在处理耗时操作时直接在 EDT 中执行,会导致界面无响应,用户体验下降。因此,多线程在 Swing 应用程序中显得尤为重要。 多线程允许...

    Java Swing 线程 下雪效果

    Java Swing 是Java GUI(图形用户界面)开发的一个重要库,它是Java AWT(Abstract Window Toolkit)的扩展,提供了更丰富的组件和更强大的功能。在Java Swing中创建动态、交互式的应用,线程管理是一个关键的概念。...

    Swing 线程之SwingUtilities invokeLater docx

    Swing 组件是线程不安全的,这意味着只能从事件派发线程(Event Dispatch Thread,简称 EDT)访问将要在屏幕上绘制的 Swing 组件。如果从其他线程访问 Swing 组件,将会导致程序崩溃或出现不可预测的结果。 在上面...

    基于swing的多线程聊天室

    3. Event Dispatch Thread(事件分发线程):Swing是单线程的,所有对组件的操作必须在EDT上进行,以确保界面的同步更新。 二、多线程技术 1. 用户界面线程:主GUI运行在EDT上,负责处理用户输入和显示UI更新。 2. ...

    JAVA 开发 Swing与多线程

    Swing的单线程模型基于"事件派发线程"(Event Dispatch Thread, EDT),所有Swing组件的渲染和事件处理都在这个线程中进行。这是因为GUI组件通常不支持线程安全的操作,多线程环境下可能会导致组件状态的不一致,...

    JavaSwing小程序

    9. **异步编程**:Swing是线程安全的,所有的UI更新必须在Event Dispatch Thread(EDT)上进行,以防止界面冻结。因此,开发者需要理解Swing的并发模型,合理使用SwingWorker进行后台任务处理。 10. **Swing应用程序...

    java+swing聊天室

    通常,GUI更新应该在事件调度线程(Event Dispatch Thread, EDT)上进行,以确保界面的流畅性。而网络通信和数据处理则应在后台线程中完成,以免阻塞UI。 Java Swing还提供了一些高级特性,如布局管理器...

    Java Swing 24种皮肤合集以及使用方法

    由于GUI更新必须在事件派发线程(Event Dispatch Thread,EDT)中进行,所以设置L&F前应确保代码运行在正确的线程。可以使用`SwingUtilities.invokeLater()`来确保这一点: ```java SwingUtilities.invokeLater(...

    一个简单Swing窗体

    最后,Swing是线程安全的,所有对组件的修改都应在Event Dispatch Thread (EDT)中进行,以避免线程安全问题。因此,更新界面状态时,通常会使用SwingUtilities的invokeLater或invokeAndWait方法。 总结起来,"一个...

    swing sample

    9. **线程管理**:Swing不是线程安全的,所有对Swing组件的修改必须在Event Dispatch Thread(EDT)上执行,否则可能会引发错误。因此,通常使用SwingUtilities.invokeLater()或SwingWorker来处理耗时的任务。 通过...

    swing代码,自己测试用

    9. **线程管理**:Swing是线程安全的,所有与UI相关的更新都应在Event Dispatch Thread(EDT)中进行,以防止出现线程冲突。 10. **拖放功能**:Swing支持拖放操作,允许用户通过拖动组件或数据在应用程序中交互。 ...

Global site tag (gtag.js) - Google Analytics