title: Java JButton not updating
body: <p>I have a JButton that when I call setText(), the text does not update. But as soon as I hover over the button, it updates. How can I fix this so that when I call setText(), the button updates? I will just post the methods that the EDT takes to get to it. It goes in order :)</p>
  
  <pre><code>public void mouseClicked(MouseEvent e) {//This is a differn't event. This is not executed by clicking on the same button. It's a differn't one.
              click(new Point(e.getX() + gridScrollPaneViewport.getViewPosition().x, e.getY() + gridScrollPaneViewport.getViewPosition().y));
          }
  
  public void click(Point point) {
                  map.selectPlot((PlotGUI) map.getComponentAt(point));
              }
  public void selectPlot(PlotGUI plot) {
          ChickenTycoon.getInstance().getScreen().getPlayingScreen().sideBar
                  .setPlot(plot);
          selectedPlot = plot;
      }
  
  public void setPlot(PlotGUI plot) {
          title.setText(plot.getName() + plot.getX() + plot.getY());
          for (Component comp : stuffPanel.getComponents()) {
              stuffPanel.remove(comp);
          }
          for (Component comp : plot.getComponentList()) {
              stuffPanel.add(comp);
          }
          update();
      }
  
  public void update() {
          if (ChickenTycoon.getInstance().getScreen().getPlayingScreen().map
                  .getSelectedPlot() != null) {
              ChickenTycoon.getInstance().getScreen().getPlayingScreen().map
                      .getSelectedPlot().update();
          }
      }
  
  public void update() {
          Log.m("Updating LandGUI");
          ((CButton) componentList[0]).setText("Buy for $ "//I know I am casting this to a CButton, it's my custom version of JButton. I tried it with a JButton and the same thing happens.
                  + ((Land) parentPlot).getPurchasePrice());
      }
  </code></pre>
  
  <p>CButton.java</p>
  
  <pre><code>package gui;
  
  import game.GameConfiguration;
  
  import java.awt.BasicStroke;
  import java.awt.Color;
  import java.awt.Dimension;
  import java.awt.Font;
  import java.awt.FontMetrics;
  import java.awt.Frame;
  import java.awt.Graphics;
  import java.awt.Graphics2D;
  import java.awt.Insets;
  import java.awt.RenderingHints;
  import java.awt.Shape;
  import java.awt.Stroke;
  import java.awt.event.ComponentEvent;
  import java.awt.event.ComponentListener;
  import java.awt.geom.Area;
  import java.awt.geom.Rectangle2D;
  import java.awt.geom.RoundRectangle2D;
  
  import javax.swing.JButton;
  import javax.swing.JOptionPane;
  import javax.swing.SwingUtilities;
  
  import chicken.GlobalConfiguration;
  
  public class CButton extends JButton implements ComponentListener {
      protected static final int BORDER_WIDTH = 5;
      private static final Font font = GlobalConfiguration.font;
      private static final Insets INSETS_MARGIN = new Insets(2, 5, 2, 5);
  
      private static final long serialVersionUID = 1L;
      protected Area m_areaDraw = null;
      private Area m_areaFill = null;
  
      private double m_dHeightDraw = 0d;
      private double m_dHeightFill = 0d;
      private double m_dWidthDraw = 0d;
  
      private double m_dWidthFill = 0d;
      private int m_nMinHeight = 0;
      private int m_nMinWidth = 0;
  
      private int m_nStringHeightMax = 0;
      private int m_nStringWidthMax = 0;
      private RoundRectangle2D m_rrect2dDraw = null;
      private RoundRectangle2D m_rrect2dFill = null;
      private Shape m_shape = null;
  
      public CButton(String strLabel) {
          setContentAreaFilled(false);
          setMargin(CButton.INSETS_MARGIN);
          setFocusPainted(false);
          addComponentListener(this);
          setFont(CButton.font);
          setText(strLabel);
      }
  
      @Override
      public void componentHidden(ComponentEvent e) {
      }
  
      @Override
      public void componentMoved(ComponentEvent e) {
      }
  
      // Needed if we want this button to resize
      @Override
      public void componentResized(ComponentEvent e) {
          m_shape = new Rectangle2D.Float(0, 0, getBounds().width,
                  getBounds().height);
          m_dWidthFill = (double) getBounds().width - 1;
          m_dHeightFill = (double) getBounds().height - 1;
          m_dWidthDraw = ((double) getBounds().width - 1)
                  - (CButton.BORDER_WIDTH - 1);
          m_dHeightDraw = ((double) getBounds().height - 1)
                  - (CButton.BORDER_WIDTH - 1);
          setShape();
          repaint();
      }
  
      @Override
      public void componentShown(ComponentEvent e) {
      }
  
      @Override
      public boolean contains(int nX, int nY) {
          if ((null == m_shape) || m_shape.getBounds().equals(getBounds())) {
              m_shape = new Rectangle2D.Float(0, 0, this.getBounds().width,
                      this.getBounds().height);
          }
          return m_shape.contains(nX, nY);
      }
  
      @Override
      public void paintBorder(Graphics g) {
          Graphics2D g2 = (Graphics2D) g;
          RenderingHints hints = new RenderingHints(
                  RenderingHints.KEY_ANTIALIASING,
                  RenderingHints.VALUE_ANTIALIAS_ON);
          g2.setRenderingHints(hints);
          g2.setColor(Color.black);
          Stroke strokeOld = g2.getStroke();
          g2.setStroke(new BasicStroke(CButton.BORDER_WIDTH,
                  BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
          g2.draw(m_areaDraw);
  
          if (getModel().isRollover()) {
              g2.setColor(Color.GRAY);
              g2.draw(m_areaDraw);
          }
          g2.setStroke(strokeOld);
      };
  
      @Override
      public void paintComponent(Graphics g) {
          Graphics2D g2 = (Graphics2D) g;
          RenderingHints hints = new RenderingHints(
                  RenderingHints.KEY_ANTIALIASING,
                  RenderingHints.VALUE_ANTIALIAS_ON);
          g2.setRenderingHints(hints);
          if (getModel().isArmed()) {
              g2.setColor(Color.CYAN.darker());
          } else {
              g2.setColor(Color.CYAN);
          }
          g2.fill(m_areaFill);
          super.paintComponent(g2);
      }
  
      private void setShape() {
          // Area
          double dArcLengthFill = Math.min(m_dWidthFill, m_dHeightFill);
          m_rrect2dFill = new RoundRectangle2D.Double(0d, 0d, m_dWidthFill,
                  m_dHeightFill, dArcLengthFill, dArcLengthFill);
          // WARNING: arclength and archeight are divided by 2
          // when they get into the roundedrectangle shape
          m_areaFill = new Area(m_rrect2dFill);
          // Border
          double dArcLengthDraw = Math.min(m_dWidthDraw, m_dHeightDraw);
          m_rrect2dDraw = new RoundRectangle2D.Double(
                  (CButton.BORDER_WIDTH - 1) / 2, (CButton.BORDER_WIDTH - 1) / 2,
                  m_dWidthDraw, m_dHeightDraw, dArcLengthDraw, dArcLengthDraw);
          m_areaDraw = new Area(m_rrect2dDraw);
      }
  
      @Override
      public void setText(final String strText) {
          CButton.super.setText(strText);
          Frame frame = JOptionPane.getRootFrame();
          FontMetrics fm = frame.getFontMetrics(font);
          m_nStringWidthMax = fm.stringWidth(getText());
          m_nStringWidthMax = Math.max(m_nStringWidthMax,
                  fm.stringWidth(getText()));
          // WARNING: use getMargin. it refers to dist btwn text and border.
          // Also use getInsets. it refers to the width of the border
          int nWidth = Math.max(m_nMinWidth, m_nStringWidthMax + getMargin().left
                  + getInsets().left + getMargin().right + getInsets().right);
          m_nStringHeightMax = fm.getHeight();
          // WARNING: use getMargin. it refers to dist btwn text and border.
          // Also use getInsets. it refers to the width of the border
          int nHeight = Math.max(m_nMinHeight, m_nStringHeightMax
                  + getMargin().left + getInsets().left + getMargin().right
                  + getInsets().right);
          setPreferredSize(new Dimension(
                  nWidth + ((2 * getFont().getSize()) / 5), nHeight
                          + ((2 * getFont().getSize()) / 5)));
          // Set the initial draw and fill dimensions
          setShape();
      }
  }
  </code></pre>