使用invokeLater后,Swing UI不会更新

Mat*_*att 7 java user-interface swing

我有一个Java Swing UI,没有像我想的那样更新/重新绘制.应用程序发送XMPP消息并在另一个线程上接收响应.处理该响应并更新UI以反映消息中包含的信息.

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

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

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

编辑:当我说更新面板时,我特别是做一个removeAll()然后添加一些JLabel.

cam*_*ckr 13

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

panel.revalidate(); // this works 99% of the time
panel.repaint(); // sometimes needed.
Run Code Online (Sandbox Code Playgroud)

其他的东西,比如validate(),invalidate()等,从AWT那天开始,我相信和revalidate()做得更好,并专门为Swing添加.