简体   繁体   中英

How can I make a JProgressBar fill up during a certain interval?

Your solution works with the timer JProgressBar fill up during a certain interval however when btn is pressed the timer doesnt start any suggestions I have included the full code ?

Here is the full code:

//Packages
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


//Class
public class PickUp 
{

    private JFrame frmPickUp;

    /**
     * Launch the application.
     */
    public static void NewScreen2() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    PickUp window = new PickUp();
                    window.frmPickUp.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    @SuppressWarnings("serial")
    public class ProgressBar extends JFrame
    {
        private int c = 0;
        private Timer t;
        private JButton btn;
        private JProgressBar pBar;
        private long currentTime;

        // 15 minutes in milliseconds
        private final int waitingTime = 15 * 60 * 1000;//900000 milliseconds

        private final int delay = waitingTime / 100;//9000 == 9 seconds

        public ProgressBar()
        {

            // delay in milliseconds
            //inside the internal anonymous class, we write the code we want the timer to execute each delay
            t = new Timer(delay, new ActionListener() {

                public void actionPerformed(ActionEvent e)
                {
                    if(c <= 100) pBar.setValue(++c);
                }
            });

            btn = new JButton("Start Timer");

            // Adding an action listener: when you click the button, the timer starts
            btn.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e)
                {
                    // starting the timer, which causes it to sending ActionEvents to its Listeners
                    t.start();
                }
            });
            getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));

            getContentPane().add(btn);//Adding the button to the content pane
            //
            //Creating a progress bar from 0 to 100
            pBar = new JProgressBar(0, 100);

            // Setting the initial value of the progress bar
            pBar.setValue(c);// c == 0

            // Showing a string progress bar
            pBar.setStringPainted(true);

            //adding a changeListener to the progress bar
            pBar.addChangeListener(new ChangeListener() {

                public void stateChanged(ChangeEvent e)
                {
                    if(pBar.getValue() == 100)
                    {
                        t.stop();
                        JOptionPane.showMessageDialog(null, "Your order is ready!");

                        c = 0;
                        pBar.setValue(c);//set the initial value of the progress bar to 0 again
                    }
                }
            });

            getContentPane().add(pBar);//Adding the progress bar to the content pane

            //normal housekeeping's stuff
            pack();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
            setLocationRelativeTo(null);
        }

        public void main(String[] args)
        {
            ProgressBar pb = new ProgressBar();
        }

    }

    /**
     * Create the application.
     */
    public PickUp() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */

    //Variables
    private void initialize() {
        frmPickUp = new JFrame();
        frmPickUp.setTitle("Pick Up");
        frmPickUp.getContentPane().setBackground(new Color(255, 250, 205));
        frmPickUp.getContentPane().setLayout(null);
        //Text, headings
        JLabel lblYourPizzaWill = new JLabel("Your pizza will be ready to pick up in:");
        lblYourPizzaWill.setFont(new Font("Tahoma", Font.BOLD, 12));
        lblYourPizzaWill.setBounds(109, 29, 238, 20);
        frmPickUp.getContentPane().add(lblYourPizzaWill);

        JLabel lblMins = new JLabel("15 MINS");
        lblMins.setFont(new Font("Tahoma", Font.BOLD, 16));
        lblMins.setForeground(new Color(255, 0, 0));
        lblMins.setBounds(189, 60, 82, 31);
        frmPickUp.getContentPane().add(lblMins);

        JProgressBar pBar = new JProgressBar(0, 100);
        pBar.setValue(0);
        pBar.setStringPainted(true);
        pBar.setBounds(212, 102, 146, 17);
        frmPickUp.getContentPane().add(pBar);

        JButton btn = new JButton("Start Timer");
        btn.setFont(new Font("Tahoma", Font.BOLD, 12));
        btn.setBounds(96, 98, 106, 23);
        frmPickUp.getContentPane().add(btn);
        frmPickUp.setBounds(100, 100, 450, 170);
        frmPickUp.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    }

You can use the Timer class to create an object, which can perform certain actions every a certain period of time (delay):

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

@SuppressWarnings("serial")
public class ProgressBar extends JFrame
{
    private int c = 0;
    private Timer t;
    private JButton btn;
    private JProgressBar pBar;

    // 15 minutes in milliseconds
    private final int waitingTime = 15 * 60 * 1000;// 900000 milliseconds

    private final int delay = waitingTime / 100;// 9000 == 9 seconds

    public ProgressBar()
    {
        setLayout(new FlowLayout());

        // delay in milliseconds
        // inside the internal anonymous class we write the code we want the timer to execute each delay
        // Instead of 50 milliseconds, you just have to write delay
        t = new Timer(delay, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                if(c <= 100) pBar.setValue(++c);
            }
        });

        btn = new JButton("WAIT");

        // Adding an action listener: when you click the button, the timer starts
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                // starting the timer, which causes it to sending ActionEvents to its Listeners
                t.start();
            }
        });

        add(btn);

        pBar = new JProgressBar(0, 100);

        // Setting the initial value of the progress bar
        pBar.setValue(c);// c == 0

        // Showing a string progress bar
        pBar.setStringPainted(true);

        // adding a changeListener to the progress bar
        pBar.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e)
            {
                if(pBar.getValue() == 100)
                {
                    t.stop();
                    JOptionPane.showMessageDialog(null, "Your order is ready!");

                    c = 0;
                    pBar.setValue(c);// set the initial value of the progress bar to 0 again
                }
            }
        });

        add(pBar);

        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable() {
            public void run()
            {
                try
                {
                    new ProgressBar();
                }
                catch(Exception ex)
                {
                    JOptionPane.showMessageDialog(null, "Fatal Error.");
                }
            }
        });
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM