我有一个 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/