package org.drugis.common.gui.task; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import org.drugis.common.threading.status.TextProgressModel; @SuppressWarnings("serial") public class TextProgressBar extends JProgressBar { public TextProgressBar(TextProgressModel model) { // setIndeterminate(!model.getDeterminate()); setString(model.getText()); setStringPainted(true); if(model.getDeterminate()) { setValue(proportionToPercentage(model.getProgress())); } else { setValue(0); } model.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if(e.getPropertyName().equals(TextProgressModel.PROPERTY_PROGRESS)) { invokeSetValue(proportionToPercentage((Double) e.getNewValue())); } else if (e.getPropertyName().equals(TextProgressModel.PROPERTY_DETERMINATE)) { invokeSetIndeterminate(!(Boolean)e.getNewValue()); } else if (e.getPropertyName().equals(TextProgressModel.PROPERTY_TEXT)) { invokeSetString((String)e.getNewValue()); } } }); } private void invokeSetString(final String v) { Runnable r = new Runnable() { public void run() { setString(v); } }; SwingUtilities.invokeLater(r); } private void invokeSetIndeterminate(final boolean v) { Runnable r = new Runnable() { public void run() { setIndeterminate(v); } }; SwingUtilities.invokeLater(r); } private void invokeSetValue(final int v) { Runnable r = new Runnable() { public void run() { setValue(v); } }; SwingUtilities.invokeLater(r); } private int proportionToPercentage(double val) { return (int) Math.round(100 * val); } }