java - 从另一个线程更新 JLabel,而无需分离线程上的所有进程?

标签 java multithreading swing jlabel event-dispatch-thread

我正在 Java Swing 上开发一个大项目。它具有数据库连接、外部设备管理和 SD 卡处理。

我目前有很多繁重的进程在 EDT 线程上运行,为所有这些进程创建单独的线程是一项漫长的任务,我试图逃避......此外,它可能会引入很多我不愿意处理的并发问题。

问题是,我想在处理长时间繁忙的任务时引入一个带有加载 gif 的加载 JLabel 。同样重要的是要强调,我希望在完成长时间任务时阻止我的整个 Swing 界面,就像现在发生的那样,除了加载标签。

有没有办法从另一个线程实现该标签?

最佳答案

如果您关心创建良好的用户体验,那么确实需要使用 SwingWorker 或类似工具来卸载事件调度程序线程 (EDT) 的工作。如果您确实需要“阻止”UI,则应该使用带有进度条或类似内容的 JDialog。

对你的问题的简短回答是否定的。 Jlabel 必须从 EDT 实例化并添加。

但是,您应该能够添加 JLabel,只需确保在长时间运行的阻塞任务开始之前执行此操作即可。然后完成后将其删除。

无论如何,这是一种 hack,也是一种做正确事情的懒惰解决方法,不推荐。您可能会发现,与使用 SwingWorkers 正确解决问题相比,您花费了更多的时间来解决问题并费尽心思。

关于java - 从另一个线程更新 JLabel,而无需分离线程上的所有进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17025391/

相关文章:

java - 变量范围

python - Python 中具有多个线程的多个进程

java - 秒表按钮

java - 选择了哪个 JRadioButton

java - 使用Java反射,我可以访问私有(private)静态嵌套类类型的私有(private)字段吗?

Java 编程验证 (GUI)

java - 如何使用@ComponentScan 注解扫描多个路径?

java - 多个线程从不同实例访问实例方法会导致竞争条件吗?

c++ - 本例中圆括号“()”重载是什么意思

java - 如何在没有 quaqua 的情况下管理 swing UI 默认字体大小?