让 Jlabel 在点击后立即出现然后在 Java 中运行代码后消失,就像 Java 进度加载器,点击操作后的事件序列

have Jlabel appear right after click then disappear after code runs in Java, like a Java progress Loader, event sequence after a click action

我是 JAVA 的新手,但我正在尝试创建一些进度加载器,但似乎无法找到让它在正确的时间出现和消失的正确方法。基本上我有一个触发一堆代码的按钮。此代码可能需要几分钟才能完成 运行。在这段时间里,我想显示一个动画沙漏.gif 并让它在完成后消失。

基本上,沙漏在jlabel 里面,一开始设置为不可见。 当在操作事件中单击 Jbutton 时,我首先编写将其设置为可见,然后它们就像 50 个 if 语句和一些写入 cmd 并检索输出的函数。然后,一旦所有这些都完成了,我就写信让它再次隐形。唯一的问题是它仅在代码进度完成后出现,这违背了将其用作进度加载器的全部目的。有谁知道如何实现这种效果? 这是代码:

    //The JLabel
    JLabel lblLoading = new JLabel("Loading");
    lblLoading.setIcon(new ImageIcon("hourglass.gif"));
    lblLoading.setBounds(407, 274, 132, 74);
    lblLoading.setVisible(false);
    // The Button Code
    btnCheckUpdates.setIcon(new ImageIcon("image/checkicon.png"));
    btnCheckUpdates.setBounds(216, 361, 148, 34);
    frame.getContentPane().add(btnCheckUpdates);
    // the action event on click
    btnCheckUpdates.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
        //I set visible to true in the begening
        lblLoading.setVisible(true);
        // Here goes like 50 if statements
        // call to function which writes to cmd.exe then returns info
        // info is checked  (like another 50 if statements)
        // call to cmd function again
        // Now after all the code is written i try to make it invisible again
        lblLoading.setVisible(false);
        }
    });

我确定我可能根本不了解某些东西是如何工作的。有谁知道为什么会发生这种情况以及如何使其正常工作或至少使用一些简单的技巧使其看起来像在工作? 任何帮助是极大的赞赏!!!

从外观上看,您正在主线程上执行所有操作,这会导致 GUI 冻结,直到更新工作负载完成。如果您打算在 Swing 中制作进度条,您最好的选择是使用 SwingWorker,这样您就可以在安全地更新 Swing 组件的同时执行后台逻辑。在您的情况下,它可能看起来像这样:

    private JLabel lblLoading;
    private UpdateTask task;

    ...
        lblLoading = new JLabel("Loading");
        lblLoading.setIcon(new ImageIcon("hourglass.gif"));
        lblLoading.setBounds(407, 274, 132, 74);
        lblLoading.setVisible(false);
        // The Button Code
        btnCheckUpdates.setIcon(new ImageIcon("image/checkicon.png"));
        btnCheckUpdates.setBounds(216, 361, 148, 34);
        frame.getContentPane().add(btnCheckUpdates);
        // the action event on click
        btnCheckUpdates.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                task = new UpdateTask().execute();
            }
        });
     }

    private class UpdateTask extends SwingWorker<Void,Void> {

        @Override
        protected Void doInBackground() throws Exception {
            lblLoading.setVisible(true);

            // Initialize progress
            setProgress(0);

            // Background logic goes here

            // Progress can be updated as necessary
            setProgress(50);

            setProgress(100);

            return null;
        }

        @Override
        protected void done() {
            lblLoading.setVisible(false);
        }
    }

还有一个功能齐全的 ProgressBarDemo 可以在 Oracle 的网站上找到。