Swing,如何正确更新UI

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的父组件.这有效,但有时我可以看到屏幕闪烁.我做错了吗?有没有更好的方法呢?

Oli*_*ire 5

正确的方法是使用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().当然,这仅对您手动绘制的组件有效.对于您重用的组件,只需调用其值更改方法即可.

  • @berry,我认为"没有SwingWorker,这是正确的做法",应理解为"使用Swing worker是正确的方法,但如果你想在不使用的情况下这样做......" (2认同)

JB *_*zet 0

通常您不需要做任何事情:如果您使用 swing 组件方法或其模型的方法,则会触发必要的事件,并且 GUI 应该自动更新自身。

如果您定义自己的模型(并且忘记触发必要的事件,但这是模型中的一个错误,则应该将其修复),情况就不会如此。