当前位置: 首页 > 面试题库 >

如何使用Swing计时器延迟进度条的加载

谷梁玺
2023-03-14
问题内容

我需要找到一种在进度条上使用Swing计时器的方法。我尝试使用Thread.sleep(),但使用它时该应用程序崩溃了。有什么方法可以使用Swing计时器而不是Sleep()?

public void piiEros(int dist)
{
    Pii pii = new Pii();
    pii.setVisible(true);
    for(int pc = 0;100 > pc; pc++)
    {
        try {
            Thread.sleep(dist/100);
        } catch (InterruptedException ex) {
            Logger.getLogger(Trav.class.getName()).log(Level.SEVERE, null, ex);
        }
        pii.pg.setValue(pc);
    }
    pii.dispose();
    o.Eros();
}

注意:Pii是带有进度条的课程。Dist是加载速度。Trav是该方法所在的类。Pc代表%,完成多少显示在栏上。o.Eros打开另一个图形用户界面。


问题答案:

(从长远来看)使用可能更容易SwingWorker。它提供了许多有用的方法来更新UI(从事件调度线程的上下文中),同时允许在后台继续执行…

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestSwingWorker02 {

    public static void main(String[] args) {
        new TestSwingWorker02();
    }

    public TestSwingWorker02() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            JProgressBar pb = new JProgressBar();
            add(pb);

            new ProgressWorker(pb, 40).execute();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

    public class ProgressWorker extends SwingWorker<Void, Integer> {

        private int delay;
        private JProgressBar pb;

        public ProgressWorker(JProgressBar progressBar, int delay) {
            this.pb = progressBar;
            this.delay = delay;
        }

        @Override
        protected void process(List<Integer> chunks) {
            // Back in the EDT...
            pb.setValue(chunks.get(chunks.size() - 1)); // only care about the last one...
        }

        @Override
        protected Void doInBackground() throws Exception {
            for (int index = 0; index < 100; index++) {
                publish(index);
                Thread.sleep(delay);
            }
            return null;
        }

        @Override
        protected void done() {
            // Back in the EDT...
            //pii.dispose();
            //o.Eros();
        }

    }

}

SwingWorker让你的逻辑中分离出来。在该doInBackground方法中,您可以专注于需要在EDT之外运行的那部分代码,可以将其publish更新回EDT并process分别更新。当您完成所有操作后,done您可以根据需要进行清理。

SwingWorker还提供了进度监视功能,因此,就您而言,如果您不想这样做,则不必使用API 的publish/
process部分。这样一PropertyChangeListener来,您无需将进度条暴露在工作人员上即可将其附加到工作人员。(但我为示例做了)

public class ProgressWorker extends SwingWorker<Void, Integer> {

    private int delay;
    private JProgressBar pb;

    public ProgressWorker(JProgressBar progressBar, int delay) {
        this.pb = progressBar;
        this.delay = delay;
        // You can use a property change listener to monitor progress updates...
        addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if ("progress".equalsIgnoreCase(evt.getPropertyName())) {
                    pb.setValue((Integer)evt.getNewValue());
                }
            }

        });
    }

    @Override
    protected Void doInBackground() throws Exception {
        for (int index = 0; index < 100; index++) {
            setProgress(index);
            Thread.sleep(delay);
        }
        return null;
    }

    @Override
    protected void done() {
        // Back in the EDT...
        //pii.dispose();
        //o.Eros();
    }

}


 类似资料:
  • 问题内容: 我做了一个二十一点游戏,我想让AI播放器在两张牌之间暂停一下。我尝试仅使用Thread.sleep(x)进行尝试,但这会使冻结,直到AI播放器拿走了他所有的卡。我知道Swing不是线程安全的,所以我看了Timers,但是我不明白如何使用它。这是我当前的代码: BTW,hit(); 方法更新GUI。 问题答案: 好吧,下面的代码显示了一个带有JTextArea和JButton的JFram

  • 我正在使用slick.js构建一个旋转木马。但是,即使我将属性从更改为,在我滚动到该图像之前,图像仍然会被加载。我怀疑这是因为我的图像中有标记。我的问题是如何防止浏览器加载响应图像,或者如何正确地延迟加载响应图像。 这是我的img标签的样本

  • 问题内容: jQuery 1.5带来了新的Deferred对象和附加的方法,以及。 对于那些以前从未使用过的用户,我已经为其添加了注释。 这些新方法的可能用途是什么,我们如何将它们适应模式? 我已经阅读了API和[源代码,所以我知道它的作用。我的问题是我们如何在日常代码中使用这些新功能? 我有一个缓冲区类的简单示例,该类按顺序调用AJAX请求。(上一个完成后,下一个开始)。 我在寻找示威和可能的用

  • 问题内容: 我想知道如何在Java中的Swing应用程序中添加时间延迟,我使用,并且我也使用了SwingWorker,但是它不起作用。这是我的代码的一部分: 我希望您在使用SwingWorker时能帮助我或解决我的疑问。 问题答案: 这是一个使用

  • 我可以在占位符中加载旋转动画的微调器,直到使用Glide加载图像吗? 我正在尝试使用占位符(R.Drawable.spinner)来实现这一点,没有动画出现? 如果有人能帮我,那太好了? 谢谢

  • 问题内容: 我一直在尝试了解如何添加进度条,我可以在正在实现的GUI中创建一个进度条,并使其显示出来,即使在通过http://docs.oracle.com/javase/tutorial/uiswing/components检查之后/progress.html对于如何将方法设置为任务,以便可以创建用于运行方法的进度栏,我仍然不清楚。请有人可以尝试向我解释这一点,还是可以发布一个示例,该示例在GU