java - 我的 Swing 组件图形未更新

标签 java swing jpanel jscrollpane jlabel

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

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

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

最佳答案

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

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

关于java - 我的 Swing 组件图形未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464632/

相关文章:

Java Swing - 在组合框上搜索

java - GridBagLayout 为什么第三列更大?

java - 当我在 JTextField 中写入时,JPopupMenu 会自动调整大小

java - 按下菜单项时如何在 jFrame 中显示 jPanel

java - 如何将 JPanel 添加到 JScrollPane?

java - 如何在 JPanel 中显示图像

java - 线程处于 RUNNABLE 状态但堆栈跟踪显示它正在处理?

java - 在Java for Android中比较图像

java - JOOQ 检查器的 Gradle 注释处理器

java - 如何在indexOf中使用int[][]之外的列表?