如何使用单独的线程填充progressBar?

时间:2017-08-09 08:15:24

标签: java multithreading jprogressbar

我目前正在解决以下问题:如何在单击开始按钮时使用线程来填充进度条(一步一步)。 我没有遇到构建线程或进度条的问题。 然而,当我填写酒吧时,我继续如下:

public class event implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent ae) {
        Try t = new Try(250);
        Thread MyT = new Thread(t);


       MyT.start();   

        try {
            MyT.sleep(500);
        } catch (InterruptedException ex) {
            Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
        }

        pr.setValue(pr.getValue()+25);
        System.out.println("check");

        try {
            MyT.sleep(5000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
        }

        pr.setValue(pr.getValue()+25);
        System.out.println("check");


    }
}

这里的问题是我预计在500毫秒后,条形图将被填充25个单位,然后在5000毫秒后再次填充其他25个单元(一步一步)。相反,我的程序在500毫秒后不会用25填充条形图,但在5000毫秒后填充50条。为什么这样,如何在不修改线程类的情况下逐渐调整条形图?

1 个答案:

答案 0 :(得分:0)

是的,我知道这个问题很旧,但是也许可以帮助某个人。

我实现了一个进度条类,该类提供了一种简单的方法,可以在指定的时间内将进度条填充为某个值。

像这样使用:

   // create progress bar
   ProgressBar progressbar = new ProgressBar();

   // fill progress bar in steps each one second
   progressbar.fillInMills(1000, 25);
   progressbar.fillInMills(1000, 50);
   progressbar.fillInMills(1000, 75);
   progressbar.fillInMills(1000, 100);

   // resets to zero
   progressbar.reset(); 

import javax.swing.JProgressBar;

public class ProgressBar extends JProgressBar {

        Thread thread;
        final int MAX = 100;
        final int MIN = 0;

        public ProgressBar() {
            super(HORIZONTAL);
            setMinimum(MIN);
            setMaximum(MAX);
        }

        /**
         * Fills the progress bar to the specified level in the specified time.
         * 
         * @param millis the time in milliseconds
         * @param fillTo the level in percentage
         */
        public void fillInMills(final int millis, final int fillTo) {
            thread = new Thread(() -> {
                try {
                    final int startAt = getValue();
                    final int timeBetweenSteps = millis / Math.max(fillTo - startAt, 1);
                    for (int i = startAt; i <= fillTo; i++) {
                        setValue(i);
                        Thread.sleep(timeBetweenSteps);
                    }
                } catch (final InterruptedException ignored) {
                    // thread is cancelled
                }
            });

            thread.start();
        }

        /**
         * Resets the ProgressBars level to zero.
         */
        public void reset() {
            if (thread != null) {
                thread.interrupt();
            }
            this.setValue(0);
        }
    }

如果您需要JProgressBar的高级功能,请参见此Oracle Tutorial on Progress Bars以获取详细信息。