java - 当一个长进程正在运行时,如何在我的 JFrame 中加载动画 GIF?

标签 java swing jframe swingworker

问题 当一个按钮被点击时,它需要弹出一个正在加载的 GIF,同时执行一个很长的过程。该过程完成后,此弹出窗口会自动关闭。

我的方法

    if (evt.getSource() == processButton) {

            ImageIcon loading = new ImageIcon("img/loading.gif");
            final JLabel loaderLabel = new JLabel("loading", loading, JLabel.CENTER);
            Thread t = new Thread(new Runnable() {

                @Override
                public void run() {
                    ProcessFrame.this.frame.add(loaderLabel);
                }

            });
        process(); // long process
        loaderLabel.setVisible(false);
    }

ProcessFrame 是用户与之交互的主要 JFrame。

我遇到了什么问题?

加载图像永远不会弹出(或至少作为标签)。关注了一些关于 SO 的帖子,但到目前为止没有成功。我哪里错了?

备选

使用 SwingWorker。但是,如果进程正在执行,我怎么知道 SLEEP_TIME 呢?或者更准确地说,何时以及如何将 SwingWorker 与正在运行的 process() 方法集成?

  SwingWorker<Void, Void> mySwingWorker = new SwingWorker<Void, Void>(){
     @Override
     protected Void doInBackground() throws Exception {

        Thread.sleep(SLEEP_TIME);
        return null;
     }
  };

最佳答案

这...

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        ProcessFrame.this.frame.add(loaderLabel);
    }
});

是个坏主意,因为您违反了 Swing 的单线程规则(并且您永远不会启动 Thread)

它应该更像是……

ProcessFrame.this.frame.add(loaderLabel);
ProcessFrame.this.frame.revalidate();
ProcessFrame.this.frame.repaint();

然后你应该运行 process();//SwingWorker 中的长进程,使用它的 PropertyChangeSupport 来确定工作人员何时完成,作为 example

关于java - 当一个长进程正在运行时,如何在我的 JFrame 中加载动画 GIF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719923/

相关文章:

java - 使用 Java 将文本复制到剪贴板

java - 使用 List<String> 填充 JList nullpointerException

java - 如何使 JFrame 具有特定大小,不包括边框?

java - 我的台词没有去到它们应该去的地方

java - 有什么理由不使用 git-masquerading-as-cvs 作为 cvs 的升级吗?

java - 编译过程中复制文件

java - Java有Hashable、Hasher之类的东西吗?

java - ArrayList 创建 : (some object) cannot be stored in an array of type java. lang.Object[]

java - 从菜单到 JPanel 的图像/面板/按钮有困难

Java 将 ArrayList 传递给另一个 JFrame