如何使用单独的线程来填充进度条?

问题描述 投票:0回答:1

我目前正在解决以下问题:当点击开始按钮时,如何使用一个线程来填充进度条(一步一步的)。

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个单位。为什么会这样,我怎样才能在不修改线程类的情况下,使条形图逐渐充满?

java multithreading jprogressbar
1个回答
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进度条教程 详细的信息。

© www.soinside.com 2019 - 2024. All rights reserved.