TomMonTom
TomMonTom

Reputation: 45

Setting up a progress bar in Java

I have a program currently and have tried to implement a progress bar with my code. Bellow is an example of the code currently. The main GUI is in its own class and instantiates other classes to then execute code within those classes' methods. An example is as follows:

class MainClass {
    public javax.swing.JProgressBar progressBar;
    private void combineActionPerformed(java.awt.event.ActionEvent evt) {
        Combine combiner = new Combine();
        combiner.Merge(folder);
    }
}

It takes a folder listing and then goes to the Combine class which has the following code:

public class Combine extends SwingWorker<Integer,Integer>{
    public void Merge(Folder []){ (for int i=0;i<folder.length;i++){
        merge(folder[i]);

    }
    public void Merge(folder[]){
        output stream;
    }
}

How do I implement the swing worker properly in this example to make a progress update to the MainClass progress bar as each iteration of i occurs?

Upvotes: 0

Views: 348

Answers (2)

milez
milez

Reputation: 2201

To begin, your worker is missing some methods it should implement, such as doInBackground() and done(). You also need a constructor to pass Folder[].

public class Combine extends SwingWorker<Integer,Integer>{

    Folder[] folders; 


    public Combine (Folder[] folders)
    {   this.folders = folders; }       

    private void Merge(Folder [])
    { (for int i=0;i<folder.length;i++)
        {
            merge(folder[i]);
            //Send the message of progress here, it will be executed
            //from doInBackground()
            setProgress(....);
        }

    }
    private void Merge(folder){
        output stream;
    }

    protected Integer doInBackground()
    {
        merge(folders);
        return null;
    }

    protected void done()
    { .... }
}

Then you would call this worker with

Combine combiner = new Combine(folders);
combiner.execute();

To track progress, this example is from SwingWorker API:

 combiner.addPropertyChangeListener(
     new PropertyChangeListener() {
         public  void propertyChange(PropertyChangeEvent evt) {
             if ("progress".equals(evt.getPropertyName())) {
                 progressBar.setValue((Integer)evt.getNewValue());
             }
         }
     });

Upvotes: 1

Tim B
Tim B

Reputation: 41208

Use the setProgress method as you are doing your processing to send the update. You could simply count how many files there are and call setProgress with (numberProcessed*100)/totalNumber. Note that the multiplication is done first to prevent rounding issues.

This will cause the PropertyChangeListeners to be notified of the changes, this will happen on the EDT so it will be safe to update your JProgressBar from it.

Upvotes: 0

Related Questions