在对 Swing 进行一些操作后更新 UI 的正确方法是什么?
例如,点击一个按钮后,调用一个方法可能几乎是即时的或需要几秒钟。事实上,所有应用程序逻辑都是通过 Web 服务远程完成的,因此稍等片刻以等待应用程序响应是正常的。
我的按钮事件处理程序可能如下所示:
myButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
//callWebService();
//do stuff
//updateUI(); // <----- repaint? revalidate? what?
}
});
我当前的实现调用 updateUI 方法,该方法在内部调用 validate() 和 repaint() 到保存 UI 的父组件。这有效,但有时我会看到屏幕闪烁。我做错了吗?有更好的方法吗?
最佳答案
正确的方法是使用 SwingWorker
, 但如果您想手动执行此操作,则必须实现以下模式:
@Override public void actionPerformed(java.awt.event.ActionEvent evt) {
new Thread() {
@Override public void run () {
//callWebService();
//do stuff
SwingUtilities.invokeLater(new Runnable(){
@Override public void run() {
//updateUI(); // <----- repaint? revalidate? what?
}
});
}
}.start();
}
对于重绘/重新验证问题,通常调用revalidate()
然后调用repaint()
。当然,这仅对您手动绘制的组件有效。对于您复用的组件,只需调用它们的值更改方法即可。
关于java - Swing,如何正确更新UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4921009/