- if (pg == null) {
- setPresent(false);
- } else {
- final JProgressBar bar = new JProgressBar();
- bar.setStringPainted(true);
-
- bars.clear();
- bars.put(pg, bar);
-
- bar.setMinimum(pg.getMin());
- bar.setMaximum(pg.getMax());
- bar.setValue(pg.getProgress());
- bar.setString(pg.getName());
-
- pg.addProgressListener(new Progress.ProgressListener() {
- public void progress(Progress progress, String name) {
-
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- Map<Progress, JProgressBar> newBars = new HashMap<Progress, JProgressBar>();
- newBars.put(pg, bar);
-
- bar.setMinimum(pg.getMin());
- bar.setMaximum(pg.getMax());
- bar.setValue(pg.getProgress());
- bar.setString(pg.getName());
-
- for (Progress pg : getChildrenAsOrderedList(pg)) {
- JProgressBar bar = bars.get(pg);
- if (bar == null) {
- bar = new JProgressBar();
- bar.setStringPainted(true);
- }
-
- newBars.put(pg, bar);
-
- bar.setMinimum(pg.getMin());
- bar.setMaximum(pg.getMax());
- bar.setValue(pg.getProgress());
- bar.setString(pg.getName());
- }
-
- bars = newBars;
-
- if (pg.isDone()) {
- for (ActionListener listener : listeners) {
- listener.actionPerformed(new ActionEvent(
- ProgressBar.this, 0, "done"));
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ if (pg != null) {
+ final JProgressBar bar = new JProgressBar();
+ bar.setStringPainted(true);
+
+ bars.clear();
+ bars.put(pg, bar);
+
+ bar.setMinimum(pg.getMin());
+ bar.setMaximum(pg.getMax());
+ bar.setValue(pg.getProgress());
+ bar.setString(pg.getName());
+
+ pg.addProgressListener(new Progress.ProgressListener() {
+ @Override
+ public void progress(Progress progress, String name) {
+ final Progress.ProgressListener l = this;
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ Map<Progress, JProgressBar> newBars = new HashMap<Progress, JProgressBar>();
+ newBars.put(pg, bar);
+
+ bar.setMinimum(pg.getMin());
+ bar.setMaximum(pg.getMax());
+ bar.setValue(pg.getProgress());
+ bar.setString(pg.getName());
+
+ synchronized (lock) {
+ for (Progress pgChild : getChildrenAsOrderedList(pg)) {
+ JProgressBar barChild = bars
+ .get(pgChild);
+ if (barChild == null) {
+ barChild = new JProgressBar();
+ barChild.setStringPainted(true);
+ }
+
+ newBars.put(pgChild, barChild);
+
+ barChild.setMinimum(pgChild.getMin());
+ barChild.setMaximum(pgChild.getMax());
+ barChild.setValue(pgChild.getProgress());
+ barChild.setString(pgChild.getName());
+ }
+
+ if (ProgressBar.this.pg == null) {
+ bars.clear();
+ } else {
+ bars = newBars;
+ }
+ }
+
+ if (ProgressBar.this.pg != null) {
+ if (pg.isDone()) {
+ pg.removeProgressListener(l);
+ for (ActionListener listener : actionListeners) {
+ listener.actionPerformed(new ActionEvent(
+ ProgressBar.this, 0,
+ "done"));
+ }
+ }
+
+ update();
+ }