class LongTask { private int lengthOfTask; private int current = 0; private String statMessage; LongTask () { //compute length of task ... //in a real program, this would figure out //the number of bytes to read or whatever lengthOfTask = 1000; } //called from ProgressBarDemo to start the task void go() { current = 0; final SwingWorker worker = new SwingWorker() { public Object construct() { return new ActualTask(); } }; } //called from ProgressBarDemo to find out how much work needs to be done int getLengthOfTask() { return lengthOfTask; } //called from ProgressBarDemo to find out how much has been done int getCurrent() { return current; } void stop() { current = lengthOfTask; } //called from ProgressBarDemo to find out if the task has completed boolean done() { if (current >= lengthOfTask) return true; else return false; } String getMessage() { return statMessage; } //the actual long running task, this runs in a SwingWorker thread class ActualTask { ActualTask () { //fake a long task, //make a random amount of progress every second while (current < lengthOfTask) { try { Thread.sleep(1000); //sleep for a second current += Math.random() * 100; //make some progress statMessage = "Completed " + current + " out of " + lengthOfTask + "."; } catch (InterruptedException e) { } } } } }