Java Swing How to - Extend SwingWorker to do progress task








Question

We would like to know how to extend SwingWorker to do progress task.

Answer

import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
// w ww  . j ava 2  s  . c  o m
import javax.swing.JFrame;
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) {
    JProgressBar pb = new JProgressBar();
    JTextArea ta = new JTextArea(10, 20);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JScrollPane(ta));
    frame.add(pb, BorderLayout.SOUTH);
    frame.pack();
    frame.setVisible(true);

    new BackgroundWorker(ta, pb).execute();
  }
}

class BackgroundWorker extends SwingWorker<Void, String> {
  private JProgressBar pb;
  private JTextArea ta;

  public BackgroundWorker(JTextArea ta, JProgressBar pb) {
    this.pb = pb;
    this.ta = ta;
    addPropertyChangeListener(new PropertyChangeListener() {
      @Override
      public void propertyChange(PropertyChangeEvent evt) {
        if ("progress".equalsIgnoreCase(evt.getPropertyName())) {
          BackgroundWorker.this.pb.setValue(getProgress());
        }
      }

    });
  }

  @Override
  protected void done() {
  }

  @Override
  protected void process(List<String> chunks) {
    for (String text : chunks) {
      ta.append(text);
      ta.append("\n");
    }
  }

  @Override
  protected Void doInBackground() throws Exception {
    for (int index = 0; index < 100; index++) {
      publish("Line " + index);
      setProgress(index);
      Thread.sleep(125);
    }
    return null;
  }
}