Hec*_*ret 8 java user-interface swing
在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?
}
});
Run Code Online (Sandbox Code Playgroud)
我当前的实现调用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();
}
Run Code Online (Sandbox Code Playgroud)
对于重绘/重新确认的问题,通常称之为revalidate()则repaint().当然,这仅对您手动绘制的组件有效.对于您重用的组件,只需调用其值更改方法即可.
通常您不需要做任何事情:如果您使用 swing 组件方法或其模型的方法,则会触发必要的事件,并且 GUI 应该自动更新自身。
如果您定义自己的模型(并且忘记触发必要的事件,但这是模型中的一个错误,则应该将其修复),情况就不会如此。
| 归档时间: |
|
| 查看次数: |
18202 次 |
| 最近记录: |