1

我意识到如果没有代码,这可能很难回答,但问题是我不确定要发布什么代码。我的问题是,当我加载 XML 文件时,对其进行解组,然后迭代加载的值的 ArrayList 以重新填充放置在 JScrollPane 内的 JPanel 上的 JLabel 数组,直到整个处理完成,图形才会更新。当我创建一个用 JProgressBar 打开的 JFrame 时,我发现了这一点。在一切完成之前,该栏甚至不会在窗格框架上显示或绘制。这违背了目的,因为我试图让进度条显示解码的进度。在调试时,我发现如果我隔离代码(除了实际加载文件和进行解组),该栏就可以工作。这让我看了看,我注意到当单独的 JLabel 添加和调整大小时,提到的其他组件没有更新,直到所有过程完成,尽管不断地重新绘制。由于我还是 JAVA 的新手,我想我会问是否有人知道在此循环进行时所有这些组件不会以图形方式更新的原因。

请注意,在循环中,我调用 add 和 repaint 函数将新解码的 JLabel 放置在窗格上,但它不会显示,直到所有完成,就像栏一样。所有这一切都在运行单线程(除了 JProgressBar 它被旋转到它自己的线程中)。ll

如果您愿意,我可以发布代码,请指导我使用您想要的代码(即 XML 解码器和循环、JLabels 的添加和大小、实例化等)。

4

2 回答 2

2

您正在“事件调度”线程上进行工作,该线程与用于运行 swing 的线程相同。您需要在单独的线程中完成您的工作。看一下 SwingWorker 类

于 2012-05-05T18:19:23.763 回答
2

您的问题是您正在 Swing 事件线程或 EDT 上进行所有处理。解决方案是使用后台线程,例如可以通过 SwingWorker 对象获得。

有关这方面的更多信息,请查看名为Concurrency in Swing的 Java Swing 教程。它将描述事件线程,为什么尊重而不是阻塞很重要,以及如何使用 SwingWorker 对象进行后台处理。

于 2012-05-05T18:19:31.777 回答