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

Java 如何使用Swing计时器延迟加载进度条,java,swing,timer,progress-bar,sleep,Java,Swing,Timer,Progress Bar,Sleep,我需要找到一种方法来使用带有进度条的Swing计时器。我尝试使用Thread.sleep,但当我使用它时,应用程序崩溃了。有没有办法用摆动计时器代替睡眠 public void piiEros(int dist) { Pii pii = new Pii(); pii.setVisible(true); for(int pc = 0;100 > pc; pc++) { try { Thread.sleep(dist/10

我需要找到一种方法来使用带有进度条的Swing计时器。我尝试使用Thread.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将打开另一个GUI。

您可以通过以下方式更改piiEros方法:

public void piiEros(int dist)
{
    final Pii pii = new Pii();
    pii.setVisible(true);
    javax.swing.Timer  timer = new javax.swing.Timer(dist/100, new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        pii.pg.setValue(pg.getValue()++);
        if ( pii.pg.getValue() > 100 )
        {
          timer.stop();
          pii.dispose();
          o.Eros();
        }
      }
    });
    timer.setInitialDelay(0);
    timer.setRepeats(true);
    timer.start();
}
您可以通过以下方式更改piiEros方法:

public void piiEros(int dist)
{
    final Pii pii = new Pii();
    pii.setVisible(true);
    javax.swing.Timer  timer = new javax.swing.Timer(dist/100, new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        pii.pg.setValue(pg.getValue()++);
        if ( pii.pg.getValue() > 100 )
        {
          timer.stop();
          pii.dispose();
          o.Eros();
        }
      }
    });
    timer.setInitialDelay(0);
    timer.setRepeats(true);
    timer.start();
}

从长远来看,使用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可能更容易。它提供了许多有用的方法,用于从事件调度线程的上下文更新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();
        }

    }

}


很抱歉,代码错误,空格会自动删除。编辑:Eng Fouad修复了缩进,谢谢!这里有一个更可读的代码:不要在EDT上睡觉!顺便说一句,当谈到进度条时,使用SwingWorker。可能最好使用SwingWorker。因此,请参见代码中的抱歉,空格只是删除了它们自己。编辑:Eng Fouad修复了缩进,谢谢!这里有一个更可读的代码:不要在EDT上睡觉!顺便说一句,当涉及到进度条时,使用SwingWorker。可能最好使用SwingWorker。因此无需调用setDelay,您已经在构造函数中建立了;是的,我喜欢肯定地说;IDE不喜欢在方法中调用javax.swing.Timer,我总是添加我以前想要创建的对象的名称,所以现在看起来是这样的:Timer Timer=new Timerdist/100,new actionlistener无法理解您的意思..您的IDE是不是在抱怨它看到javax.swing.Timer?不需要调用setDelay,您已经在构造函数中建立了;是的,我喜欢肯定地说;IDE不喜欢在方法中调用javax.swing.Timer,我总是添加我之前想要创建的对象的名称,所以现在看起来是这样的:Timer Timer=new Timerdist/100,新ActionListener无法理解您的观点..您的意思是您的IDE在看到javax.swing.Timer时会抱怨吗?+1表示现代简洁的答案。但你们不认为对于这样一个小任务,SwingWorker是一个相当大的任务。就个人而言,我觉得它更干净,更容易理解,但我明白了,我很简单..程序员自己的品味+1为现代而简洁的答案。但你们不认为对于这样一个小任务,SwingWorker是一个相当大的任务。就个人而言,我觉得它更干净,更容易理解,但我明白了,我很简单..程序员自己的品味。。;