title: How can I make a Progress Bar class that's value can be Updated from the calling class
body: <p>I have tried following tutorials but I keep getting lost somewhere.  </p>
  
  <p>What I need is a class that creates and displays a progress bar (<code>JProgressBar</code>) that I can set the value of as I iterate over data loaded from a file and place into the database memory.  My problems come that every example I have found has some kind of counter that fills the progress bar and executes from a "main" function.  Every time I alter that tutorial to be a class that I can call at will and display the bar, I do not get the bar showing (IE the frame comes up but the bar does not even look like it is added to the frame until after the iteration is done).  </p>
  
  <p>I have tried using <code>SwingUtilities.invokeLater</code> and <code>SwingWorker</code> (latest attempt at class below) all having the same issue.  To make matters worse, I can do a <code>dbug.myMessage</code> (basically sends to <code>System.out</code>) and see a message that shows that the bar is changing in memory just not showing.  I am obviously missing something probably simple but I can't think of what it is.</p>
  
  <p>One other thing, if I leave the tutorial as is <a href="http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/ProgressBarDemo2Project/src/components/ProgressBarDemo2.java" rel="nofollow">Java Tutorials Code Sample – ProgressBarDemo2.java</a> and just change the main to a createAndShow method, it works but of course it does not do what I need it to do.</p>
  
  <p>I did post another question about this but have altered the class so much I thought it best to post a new question.</p>
  
  <p>So, here is my altered code that does not seem to work:</p>
  
  <pre><code>public class MyProgressBar extends JPanel implements PropertyChangeListener, 
                                                       MyData, 
                                                       Serializable {
  
      /**
       * 
       */
      private static final long serialVersionUID = -1632492668549544408L;
  
      private MyDebug         dbug               = new MyDebug( MyData.MYDEBUGCHECK.MYPROGRESSBAR.getOn() );
  
      public static final int MAX                = 100;
      public static final int WIDTH              = 400;
      public static final int HEIGHT             = 75;
  
      private JProgressBar    myBar              = new JProgressBar( SwingConstants.HORIZONTAL, 0, MAX );
      private JFrame          myFrame            = new JFrame();
  
      public  Task            task;
  
  
      class Task extends SwingWorker&lt;Void, Void&gt; {
  
          public int myValue = 0;
  
          @Override
          public Void doInBackground() {
              //Initialize progress property.
              setProgress(0);
              while (myValue &lt; 100) {
                  //Make random progress.
                  //myValue += random.nextInt(10);
                  setProgress( Math.min( myValue, 100 ) );
                  dbug.myMessage( "MYPROGRESSBAR", "doInBackground", "Value is %3.2f %d", myBar.getPercentComplete(), myValue );
                  myBar.repaint();
              }
              return null;
          }
  
          public void done() {
          }
  
          public void mySetValue( int percent ) {
              myValue = (int)( MAX * ( (double)percent / 100.0 ) );
              dbug.myMessage( "MYPROGRESSBAR", "mySetValue", "Value is %3.2f %d percent was %d", myBar.getPercentComplete(), myValue, percent );
          }
  
      }
  
  
  
      public MyProgressBar() {
          add(myBar);
  
          int x = ( MyData.SCREEN.width  / 2 ) - ( WIDTH  / 2);
          int y = ( MyData.SCREEN.height / 2 ) - ( HEIGHT / 2);
  
          this.setBounds( x, y, WIDTH, HEIGHT );
  
          myFrame.setBounds( x, y, WIDTH, HEIGHT );
          myFrame.setUndecorated(true);
          myFrame.getContentPane().setSize( new Dimension( WIDTH, HEIGHT ) );
          myFrame.setMinimumSize( new Dimension( WIDTH, HEIGHT ) );
          myFrame.setPreferredSize( new Dimension( WIDTH, HEIGHT ) );
          myFrame.setSize( new Dimension( WIDTH, HEIGHT ) );
          myFrame.setVisible(false);
          myFrame.getContentPane().setLayout(null);
          myFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
  
          myBar.setStringPainted( true );
          myBar.setBorderPainted( true );
          myBar.setValue( 0 );
          myBar.setBounds( 0, 0, WIDTH, HEIGHT );
          myBar.addPropertyChangeListener( this );
  
          myFrame.add( myBar );
  
          //Create and set up the content pane.
          //JComponent newContentPane = new MyProgressBar();
          JComponent newContentPane = myBar;
          newContentPane.setOpaque(true);                     //content panes must be opaque
  
          myFrame.setContentPane(newContentPane);
          myFrame.pack();
  
      }
  
      public void createAndShow () {
  
          //Display the window.
          myFrame.setVisible(true);
          myFrame.repaint();
  
      }
  
      public void hideAndClear () {
          //myFrame.setVisible(false);
      }
  
  
      @Override
      public void propertyChange(PropertyChangeEvent args) {
          dbug.myMessage( "MYPROGRESSBAR", "propertyChange", "Value is %s", args.getPropertyName() );
          if ( "progress" == args.getPropertyName() ) {
              int progress = (Integer) args.getNewValue();
              //myBar.setValue(progress);
          }
      }
  
      public void start () {
          //Instances of javax.swing.SwingWorker are not reusuable, so
          //we create new instances as needed.
          task = new Task();
          task.addPropertyChangeListener(this);
          task.execute();
      }
  
  }
  </code></pre>