Java 如何从另一个JPanel/JFrame/etc添加字符串JList元素?

Java 如何从另一个JPanel/JFrame/etc添加字符串JList元素?,java,swing,concurrency,jlist,swingworker,Java,Swing,Concurrency,Jlist,Swingworker,我知道如何实际将元素添加到JList本身,但我不确定如何在实际发生更新时更新我的事件日志(它使用JList和DefaultListModel)。似乎我的应用程序冻结了,然后所有条目都会在结束时显示出来。请提供帮助?我百分之百确定您遇到了Swing并发问题,您将Swing事件调度线程或EDT与长时间运行的进程绑定在一起。问题是Swing偶数线程负责执行所有Swing绘图和用户交互。如果它与一些长时间运行的进程(如文件或数据库输入或输出)相关联,那么它就不能履行其职责,整个GUI就会冻结。解决方案是

我知道如何实际将元素添加到JList本身,但我不确定如何在实际发生更新时更新我的事件日志(它使用JList和DefaultListModel)。似乎我的应用程序冻结了,然后所有条目都会在结束时显示出来。请提供帮助?

我百分之百确定您遇到了Swing并发问题,您将Swing事件调度线程或EDT与长时间运行的进程绑定在一起。问题是Swing偶数线程负责执行所有Swing绘图和用户交互。如果它与一些长时间运行的进程(如文件或数据库输入或输出)相关联,那么它就不能履行其职责,整个GUI就会冻结。解决方案是使用后台线程,例如SwingWorker,这样长时间运行的流程就不会占用EDT,但要注意更新Swing组件,例如JList或EDT上的模型


有关该问题及其解决方案的更多详细信息,请查看。

您在过去的生活中是持枪者吗?;]+1我的程序中有多线程。它在每个线程上进行文件转换。如果我想在每个线程完成时更新日志,我是否需要像线程一样多的Swingworker?@Backonhead:我不确定。使用SwingWorker并不是绝对的要求,但它确实为在Swing中进行后台处理提供了一些方便的方法和结构。不过,您有必要在后台线程中进行处理,您可能希望使用某种线程池。问题是,当后台任务“完成”时,我不会总是有相同的输出。我想我可以把信息存储在字符串中。。。比如说,我可以让8个SwingWorker各自在自己的线程中运行,而不冻结GUI吗?@Backonhead:我相信是这样,但同样,您可能希望以某种方式共享线程。最好做一个测试程序,并尝试这些东西。