java - 使用 invokeLater 后 Swing UI 未更新

标签 java user-interface swing

我有一个 Java Swing UI,它没有像我认为的那样更新/重绘。该应用程序发送 XMPP 消息并在不同的线程上接收响应。处理该响应并更新 UI 以反射(reflect)消息中包含的信息。

收到响应后,我使用更新 JPanel 组件

javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() { /* execute logic to update panel */ }
});

自从我用 Java 开发以来已经有一段时间了,但根据我的在线研究,invokeLater 将可运行对象排队等待在 GUI 线程上执行。但是,直到我在应用程序中执行导致重绘的其他操作(例如调整窗口大小)后,我的 GUI 才会更新。我错过了什么?在更新面板的逻辑之后,我尝试了 invalidate() 和 repaint() 的各种组合,但结果仍然相同 - GUI 不会更新,直到我调整窗口大小。

编辑:当我说更新面板时,我具体来说是执行 removeAll() 然后添加一些 JLabel。

最佳答案

从面板中添加/删除组件后,您应该使用:

panel.revalidate(); // this works 99% of the time
panel.repaint(); // sometimes needed.

其他东西,如 validate()、invalidate() 等,是 AWT 时代遗留下来的,我相信 revalidate() 做得更好,是专门为 Swing 添加的。

关于java - 使用 invokeLater 后 Swing UI 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1178480/

相关文章:

java - 如何使用api将HTML文件转换为PPT文件?

ASP.NET:它是否涉及 Active X?

java - 如何在匿名类监听器中添加MouseEvent?

Java/swing 字体调整大小无法跨平台工作

java - 通过serial.read()确认从Ardulink的sendCustomMessage()收到的消息

Java 数组绑定(bind)异常

java - 二叉树插入根始终为空

java - 当J Panel的visibility设置为false时,J Panel的Childs是可见的,如何让childs不可见?

user-interface - 操作系统用户界面指南 : when to ignore?

java - 写入资源路径中的文件时出现 NullPointerException