1

onClick在 Java Swing 中有一个活动。

private void fastForward(java.awt.event.MouseEvent evt) { 
    loading.setVisible(true);
    //some time consuming algorithm
    loading.setVisible(false);      
}

在其中,我执行了一个消耗大量时间的操作,所以我想显示一个加载动画。

我创建了一个按钮,带有一个加载 gif 的图标,我将按钮的可见性设置为 false。如果onClick我将可见性设置为 true。问题是当整个函数执行时按钮变得可见,这不是我想要的。我希望在函数执行期间显示按钮。如何在执行期间将按钮设置为可见。

4

2 回答 2

5

那是因为,只有当 UI 线程空闲时,它才能更新 UI。这是你需要做的:

private void fastForward(java.awt.event.MouseEvent evt) { 
    loading.setVisible(true);
    new Thread(new Runnable(){

    @Override
    public void run(){
       //time consuming algorithm.
       if(done){
         SwingUtilities.invokeLater(new Runnable(){
             @Override public void run(){
                loading.setVisible(false);      
           }
          });
       }
    }

    }).start();
}

上面发生的事情是这样的:

  1. UI 线程设置加载状态。
  2. UI 线程启动一个新线程来执行命令。此调用后 UI 线程是空闲的。
  3. 新线程计算算法
  4. 新线程完成后,它会请求 UI 线程更新 UI

这样,按钮就不会被冻结。完成后,UI 线程会更新。

于 2013-04-24T10:26:31.500 回答
2

尝试使用SwingWorker

publish它具有通过使用/process方法与事件调度线程重新同步的内置功能。很容易知道它的时间done并具有进度更新功能

看看这个这个这个例子

于 2013-04-24T10:54:29.987 回答