我对 SwingUtilities 的 invokeLater 方法有一个问题,想请教一下正确使用的实践方法。
首先,我想确认我的理解是否正确。据我所知,GUI 的更改必须在 EDT 上进行,因为 Swing 组件不是线程安全的。invokeLater 方法将 Runnable 作为参数,其中包含的任何内容都将在 EDT 上运行。因此,所有对 Swing 组件的调用都被放置在一种队列中,按顺序在 EDT 上执行。
那么,我的问题是:使用它的最佳实践是什么?从我看到的,至少有两种方法:
1)在 main 方法中,将所有代码,例如 GUI 创建、Controller 创建,甚至 Model 创建(假设采用 MVC 类型模式),都放置在由 invokeLater 方法调用的 Runnable 中。当然,这是假定在 Model 中执行任何长时间运行的任务都将使用 SwingWorker 执行的情况下。
2)将 GUI 创建放置在 invokeLater 中,但将 Controller 创建和 Model 创建放置在 main 方法中。然后,每当需要从 Controller 访问 Swing 组件时,您就可以将该代码放入 invokeLater 方法中以将其放置在 EDT 队列中。
哪种方法被认为是最佳实践或不良实践?如果这两种方法都不好,那么更好的方法是什么?
非常感谢您提供的任何信息。
谢谢。
首先,我想确认我的理解是否正确。据我所知,GUI 的更改必须在 EDT 上进行,因为 Swing 组件不是线程安全的。invokeLater 方法将 Runnable 作为参数,其中包含的任何内容都将在 EDT 上运行。因此,所有对 Swing 组件的调用都被放置在一种队列中,按顺序在 EDT 上执行。
那么,我的问题是:使用它的最佳实践是什么?从我看到的,至少有两种方法:
1)在 main 方法中,将所有代码,例如 GUI 创建、Controller 创建,甚至 Model 创建(假设采用 MVC 类型模式),都放置在由 invokeLater 方法调用的 Runnable 中。当然,这是假定在 Model 中执行任何长时间运行的任务都将使用 SwingWorker 执行的情况下。
2)将 GUI 创建放置在 invokeLater 中,但将 Controller 创建和 Model 创建放置在 main 方法中。然后,每当需要从 Controller 访问 Swing 组件时,您就可以将该代码放入 invokeLater 方法中以将其放置在 EDT 队列中。
哪种方法被认为是最佳实践或不良实践?如果这两种方法都不好,那么更好的方法是什么?
非常感谢您提供的任何信息。
谢谢。