Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个线程更新JLabel,而不必分离线程上的所有进程?_Java_Multithreading_Swing_Jlabel_Event Dispatch Thread - Fatal编程技术网

Java 从另一个线程更新JLabel,而不必分离线程上的所有进程?

Java 从另一个线程更新JLabel,而不必分离线程上的所有进程?,java,multithreading,swing,jlabel,event-dispatch-thread,Java,Multithreading,Swing,Jlabel,Event Dispatch Thread,我正在开发一个关于JavaSwing的大项目。它具有数据库连接、外部设备管理和sd卡处理功能 我目前有很多繁重的进程在EDT线程上运行,为所有这些进程创建独立的线程是一项很长的任务,我正试图逃避。。。此外,它可能会引入许多我不愿意处理的并发问题 问题是,我想在处理长时间繁忙的任务时,引入一个带有加载gif的加载JLabel。同样重要的是要强调,我希望在长任务完成时阻止我的整个swing界面,就像现在发生的一样,除了加载标签 有没有一种方法可以从另一个线程实现该标签?如果您关心创建良好的用户体验,

我正在开发一个关于JavaSwing的大项目。它具有数据库连接、外部设备管理和sd卡处理功能

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

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


有没有一种方法可以从另一个线程实现该标签?

如果您关心创建良好的用户体验,那么使用SwingWorker或类似工具将工作从事件调度程序线程(EDT)中卸载是无法逃避的。如果您真的需要“阻止”UI,那么应该使用带有进度条或类似工具的JDialog

您的问题的简短答案是否。必须从EDT实例化并添加Jlabel

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


无论如何,这是一种黑客行为,是做正确事情的懒散变通方法,不推荐使用。您可能会体验到,您花费更多的时间来解决这个问题和拉扯头发,而不仅仅是与SwingWorker一起正确地处理这些问题。

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

您的问题的简短答案是否。必须从EDT实例化并添加Jlabel

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


无论如何,这是一种黑客行为,是做正确事情的懒散变通方法,不推荐使用。你可能会体验到,你花在解决问题和拉扯头发上的时间比与SwingWorkers一起正确处理问题要多。

有没有办法从另一个线程实现这个标签?您可以始终实现自己的EventQueue,并决定从另一个线程调度事件,但我非常确定您将遇到严重的并发问题。使用模态JDialog(仍然允许绘制)阻塞UI并不困难。将长时间运行的任务代码移动到另一个线程并不复杂,但需要确保Swing更新在EDT上完成。你的问题没有简单的解决办法。这将需要一些时间和精力来设置,但这是唯一的“好”解决方案感谢您的回答。那么,如果我制作了另一个swing程序,只显示加载图像并从swing调用它呢??然后线程问题将由操作系统解决,对吗?@user2471107肯定它会“工作”,但你不会有模态,如果用户单击你的原始帧,你的加载图像将消失。用户将被允许关闭正在加载的GIF等。。。您必须在代码中的任何地方调用它。同样,这是花费几乎和做正确的事情一样多的努力,最终会有一个糟糕的结果。做正确的事情:这将节省您的时间并提供一个很好的结果。@user2471107我不理解您不愿意解决真正的问题,同时又准备在解决问题时走极端。。。您可能需要几天的时间来正确修复,但这是值得的。有没有办法从另一个线程实现该标签?您可以始终实现自己的EventQueue,并决定从另一个线程调度事件,但我非常确定您将遇到严重的并发问题。使用模态JDialog(仍然允许绘制)阻塞UI并不困难。将长时间运行的任务代码移动到另一个线程并不复杂,但需要确保Swing更新在EDT上完成。你的问题没有简单的解决办法。这将需要一些时间和精力来设置,但这是唯一的“好”解决方案感谢您的回答。那么,如果我制作了另一个swing程序,只显示加载图像并从swing调用它呢??然后线程问题将由操作系统解决,对吗?@user2471107肯定它会“工作”,但你不会有模态,如果用户单击你的原始帧,你的加载图像将消失。用户将被允许关闭正在加载的GIF等。。。您必须在代码中的任何地方调用它。同样,这是花费几乎和做正确的事情一样多的努力,最终会有一个糟糕的结果。做正确的事情:这将节省您的时间并提供一个很好的结果。@user2471107我不理解您不愿意解决真正的问题,同时又准备在解决问题时走极端。。。您可能需要几天的时间来正确修复,但这是值得的。但是,您应该能够添加JLabel,您只需确保在长时间运行的阻塞任务开始错误之前执行此操作。
repait
已安排,只要该
repait
未发生,则
JLabel
不可见。这并不是一个简单的问题。问题是,即使我在长时间运行的任务之前添加它,动画gif也不会与其动画一起显示。。。就像一个图像。。。关于如何展示动画有什么想法吗?@Robin true。我不是真的推荐这种方法。@user2471107:你在q中没有提到动画