java - Swing,如何正确更新UI

标签 java swing user-interface

在对 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/

相关文章:

java - 在字符串链表的链表中查找重复项的最有效方法 - java

java - 绘制相对于矩形 Swing 的缩放字符串

java - 在并发应用程序之上构建 GUI?

java - 文件排序器 - fileNotFoundException

java - blackberry - 将NegativeMarginVerticalFieldManager中的字段置于前面

java - 从另一个类获取字符串正在传递 null

java - 尝试按照 URL 然后下载图像

java - JTable - 选定行点击事件

java - 使用JAVA上传PDF文件

java - 平开窗不可见