Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让Jlabel在单击后立即出现,然后在Java中运行代码后消失,如Java进度加载器,单击操作后的事件序列_Java_Action_Sequence_Jlabel - Fatal编程技术网

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

让Jlabel在单击后立即出现,然后在Java中运行代码后消失,如Java进度加载器,单击操作后的事件序列,java,action,sequence,jlabel,Java,Action,Sequence,Jlabel,我对JAVA非常陌生,但我正在尝试创建一个进度加载器,似乎无法找到正确的方法让它在正确的时间出现和消失。基本上我有一个按钮,可以触发一堆代码。此代码可能需要几分钟才能运行。在此期间,我希望显示一个动画hour glass.gif,并在完成后将其清除 基本上,计时器位于jlabel内部,并在开始时设置为不可见。 当在动作事件中单击Jbutton时,我首先写入并将其设置为visible,然后它们的语句类似于50个if语句,还有一些函数写入cmd并检索输出。然后,一旦所有这些都完成了,我就写信让它再次

我对JAVA非常陌生,但我正在尝试创建一个进度加载器,似乎无法找到正确的方法让它在正确的时间出现和消失。基本上我有一个按钮,可以触发一堆代码。此代码可能需要几分钟才能运行。在此期间,我希望显示一个动画hour glass.gif,并在完成后将其清除

基本上,计时器位于jlabel内部,并在开始时设置为不可见。 当在动作事件中单击Jbutton时,我首先写入并将其设置为visible,然后它们的语句类似于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);
        }
    }
private JLabel lblLoading;
私有更新任务;
...
lblLoading=新的JLabel(“加载”);
setIcon(新的图像图标(“hourglass.gif”);
lblloadeding.立根(407,274,132,74);
lblLoading.setVisible(false);
//按钮代码
setIcon(新的ImageIcon(“image/checkicon.png”);
btnCheckUpdates.setBounds(2163614834);
frame.getContentPane().add(btnCheckUpdates);
//单击时的操作事件
btnCheckUpdates.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
task=newupdateTask().execute();
}
});
}
私有类UpdateTask扩展SwingWorker{
@凌驾
受保护的Void doInBackground()引发异常{
lblLoading.setVisible(true);
//初始化进度
setProgress(0);
//背景逻辑在这里
//如有必要,可更新进度
统计进展(50);
进度(100);
返回null;
}
@凌驾
受保护的void done(){
lblLoading.setVisible(false);
}
}
甲骨文的网站上还有一个功能齐全的