Java Swing Progress Bar Example

In this post, I show you how to create a progress bar using the JProgressBar component in swing-based applications.
Check out complete Swing tutorial at https://www.javaguides.net/p/java-swing-tutorial.html.
A progress bar is a component that is used when we process lengthy tasks. It is animated so that the user knows that our task is progressing. The JProgressBar component provides a horizontal or a vertical progress bar. The initial and minimum values are 0 and the maximum is 100.

Java Swing Progress Bar Example

The below example displays a progress bar and a button. The button starts and stops progress.
package net.sourcecodeexamples.swingexample.components2;

import javax.swing.AbstractAction;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.Timer;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import static javax.swing.GroupLayout.Alignment.CENTER;

public class ProgressBarExample extends JFrame {

    private static final long serialVersionUID = 1 L;
    private Timer timer;
    private JProgressBar progBar;
    private JButton startBtn;
    private final int MAX_VAL = 100;


    private void initializeUI() {

        progBar = new JProgressBar();
        progBar.setStringPainted(true);

        startBtn = new JButton("Start");
        startBtn.addActionListener(new ClickAction());

        timer = new Timer(50, new UpdateBarListener());

        createLayout(progBar, startBtn);
        setSize(350, 150);
        setTitle("JProgressBar");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void createLayout(JComponent...arg) {

        JPanel pane = (JPanel) getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);
        gl.setAutoCreateGaps(true);

        gl.setHorizontalGroup(gl.createSequentialGroup()
            .addComponent(arg[0])
            .addComponent(arg[1])
        );

        gl.setVerticalGroup(gl.createParallelGroup(CENTER)
            .addComponent(arg[0])
            .addComponent(arg[1])
        );

        pack();
    }

    private class UpdateBarListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            int val = progBar.getValue();

            if (val >= MAX_VAL) {

                timer.stop();
                startBtn.setText("End");
                return;
            }

            progBar.setValue(++val);
        }
    }

    private class ClickAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent e) {

            if (timer.isRunning()) {

                timer.stop();
                startBtn.setText("Start");

            } else if (!"End".equals(startBtn.getText())) {

                timer.start();
                startBtn.setText("Stop");
            }
        }
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(() - > {
            ProgressBarExample progressBarExample = new ProgressBarExample();
            progressBarExample.initializeUI();
            progressBarExample.setVisible(true);
        });
    }
}
Let's understand the above Java program.
Here we created the JProgressBar component. The minimum value is 0, the maximum 100, and the initial value is 0. These are the default values. The setStringPainted() method determines whether the progress bar displays the percentage of the task completed:
progBar = new JProgressBar();
progBar.setStringPainted(true);
The timer object launches UpdateBarListener every 50ms. Inside the listener, we check if the progress bar reached its maximum value:
timer = new Timer(50, new UpdateBarListener());
The actionPerformed() method of the listener increases the current value of the progress bar. If it reaches the maximum value, the timer is stopped and the button's label is set to "End":
private class UpdateBarListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {

        int val = progBar.getValue();

        if (val >= MAX_VAL) {

            timer.stop();
            startBtn.setText("End");
            return;
        }

        progBar.setValue(++val);
    }
}
The button starts or stops the timer. The text of the button is updated dynamically; it can have "Start", "Stop", or "End" string values:
private class ClickAction extends AbstractAction {

    @Override
    public void actionPerformed(ActionEvent e) {

        if (timer.isRunning()) {

            timer.stop();
            startBtn.setText("Start");

        } else if (!"End".equals(startBtn.getText())) {

            timer.start();
            startBtn.setText("Stop");
        }
    }
}

Output

Check out complete Swing tutorial at https://www.javaguides.net/p/java-swing-tutorial.html.

Comments