Java Swing How to - Remove the indeterminate mode of JProgressBar








Question

We would like to know how to remove the indeterminate mode of JProgressBar.

Answer

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
//ww  w .  ja  v  a  2s.c  o  m
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new ProgressBarFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }
}

class ProgressBarFrame extends JFrame {
  int MAX = 1000;
  JButton  startButton = new JButton("Start");
  JProgressBar progressBar = new JProgressBar(0, MAX);
  JCheckBox checkBox = new JCheckBox("indeterminate");
  JTextArea textArea = new JTextArea();
  SimulatedActivity activity;

  public ProgressBarFrame() {
    setSize(300, 300);
    JPanel panel = new JPanel();
    progressBar.setStringPainted(true);
    panel.add(startButton);
    panel.add(progressBar);
    checkBox.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        progressBar.setIndeterminate(checkBox.isSelected());
        progressBar.setStringPainted(!progressBar.isIndeterminate());
      }
    });
    panel.add(checkBox);
    add(new JScrollPane(textArea), BorderLayout.CENTER);
    add(panel, BorderLayout.SOUTH);
    startButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        startButton.setEnabled(false);
        activity = new SimulatedActivity(MAX);
        activity.execute();
      }
    });
  }
  class SimulatedActivity extends SwingWorker<Void, Integer> {
    int current, target;
    public SimulatedActivity(int t) {
      current = 0;
      target = t;
    }

    protected Void doInBackground() throws Exception {
      try {
        while (current < target) {
          Thread.sleep(100);
          current++;
          publish(current);
        }
      } catch (Exception e) {
      }
      return null;
    }
    protected void process(List<Integer> chunks) {
      for (Integer chunk : chunks) {
        textArea.append(chunk + "\n");
        progressBar.setValue(chunk);
      }
    }
    protected void done() {
      startButton.setEnabled(true);
    }
  }
}