title: SwingPropertyChangeSupport to dynamically update JTextArea
body: <p>I'm trying to build upon the answer to a question regarding SwingPropertyChangeSupport</p>
  
  <p>I am attempting to modify the code given here in an answer by the very helpful, Hovercraft Full Of Eels: 
  <a href="https://stackoverflow.com/questions/10198936/windowlistener-does-not-work-as-expected/10199137#10199137">WindowListener does not work as expected</a>, to allow a displayed array to be updated when changes are entered via an input dialog.</p>
  
  <p>The array is updated OK but not refreshed in the GUI. I was hoping someone might be able to tell me where I've gone wrong.</p>
  
  <p>here is the code:</p>
  
  <pre><code>import java.awt.BorderLayout;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.awt.event.FocusListener;
  import java.beans.PropertyChangeEvent;
  import java.beans.PropertyChangeListener;
  import javax.swing.JButton;
  import javax.swing.JFrame;
  import javax.swing.JOptionPane;
  import javax.swing.JPanel;
  import javax.swing.JTextArea;
  import javax.swing.event.SwingPropertyChangeSupport;
  
  public class Main {
  public static void main(String[] arg) {
      GuiForUpdate display = new GuiForUpdate();
      display.setVisible(true);
  }
  }
  
  class GuiForUpdate extends JFrame implements ActionListener {
  
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private FocusListener focusListener;
  private String mList;
  private JButton changeArrayButton;
  private JTextArea codeIn, displayOutput;
  private int arrayIndex;
  private JPanel displayPanel;
  private ArrayForUpdating arrayForUpdate = new ArrayForUpdating();
  
  public GuiForUpdate() {
      setSize(224, 180);
      layoutLeft();
      layoutDisplay();
      layoutBottom();
  }
  
  /**
   * adds a display area for array
   */
  public void layoutDisplay() {
      displayPanel = new JPanel();
      add(displayPanel, BorderLayout.CENTER);
      displayOutput = new JTextArea();
      displayPanel.add(displayOutput);
      displayOutput.addFocusListener(focusListener);
  
      mList = arrayForUpdate.getBoundProperty();
  
      arrayForUpdate.addPropertyChangeListener(new PropertyChangeListener() {
  
          @Override
          public void propertyChange(PropertyChangeEvent pcEvt) {
              if (pcEvt.getPropertyName().equals(
                      ArrayForUpdating.BOUND_PROPERTY)) {
                  mList = (pcEvt.getNewValue().toString());
              }
          }
      });
  
      displayOutput.setText(mList);
  }
  
  /**
   * adds left hand side elements to left of GUI
   */
  public void layoutLeft() {
      JPanel left = new JPanel();
      add(left, BorderLayout.WEST);
      codeIn = new JTextArea(2, 2);
      left.add(codeIn);
      codeIn.addFocusListener(focusListener);
  }
  
  /**
   * adds bottom elements to bottom of GUI
   */
  public void layoutBottom() {
      JPanel bottom = new JPanel();
      changeArrayButton = new JButton("Modify array");
      changeArrayButton.addActionListener(this);
      bottom.add(changeArrayButton);
      add(bottom, BorderLayout.SOUTH);
  }
  
  /**
   * Process button clicks
   */
  public void actionPerformed(ActionEvent ae) {
  
      if (ae.getSource() == changeArrayButton) {
  
          // first check if any code entered
          if (codeIn.getText().trim().length() != 0) {
  
              // call modifyMemory() method
              modifyArray();
  
          } else
              JOptionPane.showMessageDialog(null,
                      "Please enter something first.");
      }
  }
  
  /**
   * method to process modify array
   */
  public void modifyArray() {
  
      // show dialog to retrieve entered address
      String addressToModify = (String) JOptionPane
              .showInputDialog("At which location?");
  
      // confirm if a string was entered
      if ((addressToModify != null) &amp;&amp; (addressToModify.length() &gt; 0)) {
  
          // convert to integer if decimal address entered
          arrayIndex = Integer.parseInt(addressToModify);
      }
      // pass as integer
      processInput(arrayIndex);
  }
  
  public void processInput(int a) {
  
      String newValue = codeIn.getText();
      arrayForUpdate.instructionsIn(newValue, a);
  }
  }
  
  class ArrayForUpdating {
  
  public static final String BOUND_PROPERTY = "bound property";
  private String boundProperty = "";
  
  private SwingPropertyChangeSupport spcSupport = new SwingPropertyChangeSupport(
          this);
  private StringBuilder mList;
  private int[] myArray;
  
  public ArrayForUpdating() {
  
      myArray = new int[5];
      for (int i = 0; i &lt; myArray.length; i++) {
          myArray[i] = 0;
      }
      setArrayyDisplayString();
  }
  
  /** 
   * method to create formatted string of array
   */
  public void setArrayyDisplayString() {
  
      // create StringBuilder for display in memory tab
      mList = new StringBuilder();
      for (int i = 0; i &lt; myArray.length; i++) {
  
          mList.append(String.format("%10s %02d %10s %02d", "Pos:   ", i,
                  "Value:  ", myArray[i]));
          mList.append("\n");
      }
      setBoundProperty(mList.toString());
  }
  
  /**
   * This method takes in a string passed through from the GUI
   */
  public void instructionsIn(String codeIn, int loc) {
  
      String code = codeIn.trim();
      int oc = Integer.parseInt(code);
  
      // add the data to the array
      setArrayData(loc, oc);
      loc++;
  }
  
  /**   
   * method to add data to the array
   */
  public void setArrayData(int a, int memData) {
      myArray[a] = memData;
  
      // print array to console for checking
      for (int i = 0; i &lt; myArray.length; i++) {
          System.out.println("location: " + i + " value: " + myArray[i]);
      }
      setArrayyDisplayString();
  }
  
  public SwingPropertyChangeSupport getSpcSupport() {
      return spcSupport;
  }
  
  public void setSpcSupport(SwingPropertyChangeSupport spcSupport) {
      this.spcSupport = spcSupport;
  }
  
  public String getBoundProperty() {
      return boundProperty;
  }
  
  public void setBoundProperty(String boundProperty) {
          String oldValue = this.boundProperty;
          System.out.println("old = " + oldValue);
          String newValue = boundProperty;
          System.out.println("new = " + newValue);
          this.boundProperty = newValue;
          spcSupport.firePropertyChange(BOUND_PROPERTY, oldValue, newValue);
      }
  
      public void addPropertyChangeListener(PropertyChangeListener listener) {
      spcSupport.addPropertyChangeListener(listener);
      }
  }
  </code></pre>
  
  <p>-EDIT-
  Hopefully removed compilation errors.</p>