Java 在按钮内显示加载GIF,单击并在执行操作后再次隐藏

Java 在按钮内显示加载GIF,单击并在执行操作后再次隐藏,java,swing,jframe,Java,Swing,Jframe,我有下面的JFrame,里面有一个足够简单的退出应用程序方法。我正在尝试添加某种加载程序(最好是旋转器GIF)。但是,目前我刚刚添加了一个名为loading的JLabel,以便在单击按钮时显示文本“loading…” 问题是messagebox(即操作)根本没有显示在我的函数中,加载JLabel会继续显示。有谁能解释一下为什么这不起作用,并给我一些建议,如何用GIF替换加载的文本。任何帮助都会很好 public void Exit() { btnExit.addActionListen

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

问题是messagebox(即操作)根本没有显示在我的函数中,加载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);
                    }
                }
            };
        }
    });
}
public void Exit(){
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件){
//事件开始
loading.setVisible(true);
新SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
睡眠(100);
返回null;
}
@凌驾
受保护的void done(){
//事件开始
loading.setVisible(假);
//提示用户输入消息框//
int close=JOptionPane.showConfirmDialog(面板“确定吗?”),
“信息”,作业窗格。是\否\选项);
//等待用户选择。
if(close==JOptionPane.YES\u选项){
系统出口(0);
}
}
};
}
});
}

仅仅创建
SwingWorker
是不够的。您必须在创建它之后调用它的方法

安排此SwingWorker在工作线程上执行。有 许多辅助线程可用。在事件中,所有工作线程 正在忙于处理其他SwingWorker此SwingWorker位于 排队等候

注意:SwingWorker仅设计为执行一次。执行 SwingWorker多次不会导致调用 做两次背景法

就你而言:

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
SwingWorker-worker=新的SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
睡眠(100);
返回null;
}
@凌驾
受保护的void done(){
//事件开始
loading.setVisible(假);
//提示用户输入消息框//
int close=JOptionPane.showConfirmDialog(面板“确定吗?”),
“信息”,作业窗格。是\否\选项);
//等待用户选择。
if(close==JOptionPane.YES\u选项){
系统出口(0);
}
}
};
worker.execute()//处死工人

现在这是有道理的!谢谢你的帮助!