【问题标题】:Displaying a loading GIF inside a button click and hiding it again once the action is performed在按钮单击中显示加载 GIF 并在执行操作后再次隐藏它
【发布时间】:2020-01-17 00:41:07
【问题描述】:

我有以下 JFrame,里面有一个足够简单的退出应用程序方法。我正在尝试添加某种加载器(最好是微调器 GIF)。但是,目前我刚刚添加了一个名为 loading 的 JLabel,以在单击按钮时显示文本“正在加载...”。

问题是我的函数中根本没有显示消息框(即操作),并且加载的 JLabel 继续显示。谁能解释为什么这不起作用,并就如何用 GIF 替换加载文本给我建议。任何帮助都会很棒。

 public void Exit() {
    btnExit.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            // event start
            loading.setVisible(true);

            new SwingWorker<Void, String>() {
                @Override
                protected Void doInBackground() throws Exception {
                    Thread.sleep(100);
                    return null;
                }

                @Override
                protected void done() {
                    // event start
                    loading.setVisible(false);

                    // prompt user input message box //
                    int close = JOptionPane.showConfirmDialog(panel,"Are you sure?",
                            "Information", JOptionPane.YES_NO_OPTION);

                    // await user selection.
                    if(close == JOptionPane.YES_OPTION) {
                        System.exit(0);
                    }
                }
            };
        }
    });
}

【问题讨论】:

    标签: java swing jframe


    【解决方案1】:

    创建SwingWorker 本身是不够的。您必须在创建它之后调用它的execute() 方法。

    安排此 SwingWorker 在工作线程上执行。有 许多工作线程可用。如果所有工作线程 正忙于处理其他 SwingWorkers 这个 SwingWorker 被放置在一个 等待队列。

    注意:SwingWorker 仅设计为执行一次。执行一个 SwingWorker 多次不会导致调用 doInBackground 方法两次。

    在你的情况下:

    SwingWorker<?,?> worker = new SwingWorker<Void, String>() {
        @Override
        protected Void doInBackground() throws Exception {
            Thread.sleep(100);
            return null;
        }
    
        @Override
        protected void done() {
            // event start
            loading.setVisible(false);
    
            // prompt user input message box //
            int close = JOptionPane.showConfirmDialog(panel,"Are you sure?",
                    "Information", JOptionPane.YES_NO_OPTION);
    
            // await user selection.
            if(close == JOptionPane.YES_OPTION) {
                System.exit(0);
            }
        }
    };
    worker.execute(); //Execute the worker
    

    【讨论】:

    • 现在说得通了!感谢您的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多