title: Trouble with Java Applet repainting
body: <p>The following program is supposed to place <code>X</code> strings in a tic tac toe board on a java applet so that they will remain after consecutive placements. However, when the user clicks to place an <code>X</code>, the <code>X</code> will disappear and draw elsewhere. How can I overcome this issue?  </p>
  
  <pre><code>import java.awt.event.*;
  import java.awt.*;
  import javax.swing.*;
  
  /**
   * Class TicTacToe - write a description of the class here
   * 
   * @author (your name) 
   * @version (a version number)
   */
  public class TicTacToe extends JApplet implements MouseListener
  {
      // instance variables - replace the example below with your own
      private boolean[][] board = new boolean[3][3];
      int j; int h;
      /**
       * Called by the browser or applet viewer to inform this JApplet that it
       * has been loaded into the system. It is always called before the first 
       * time that the start method is called.
       */
      public void init()
      {
          // this is a workaround for a security conflict with some browsers
          // including some versions of Netscape &amp; Internet Explorer which do 
          // not allow access to the AWT system event queue which JApplets do 
          // on startup to check access. May not be necessary with your browser. 
          JRootPane rootPane = this.getRootPane();    
          rootPane.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
  
          addMouseListener(this);
          // provide any initialisation necessary for your JApplet
      }
  
      public void mouseExited(MouseEvent e){}
  
      public void mouseEntered(MouseEvent e){}
  
      public void mouseReleased(MouseEvent e){}
  
      public void mousePressed(MouseEvent e){}
  
      public void mouseClicked(MouseEvent e){
          int x = e.getX();  int y = e.getY();
          j = x; h = y;
  
          x -= 50;
          y-= 50;
          x/=50;
          y/=50;
  
          board[x][y] = true;
  
          repaint();
      }
  
      /**
       * Called by the browser or applet viewer to inform this JApplet that it 
       * should start its execution. It is called after the init method and 
       * each time the JApplet is revisited in a Web page. 
       */
      public void start()
      {
          // provide any code requred to run each time 
          // web page is visited
      }
  
      /** 
       * Called by the browser or applet viewer to inform this JApplet that
       * it should stop its execution. It is called when the Web page that
       * contains this JApplet has been replaced by another page, and also
       * just before the JApplet is to be destroyed. 
       */
      public void stop()
      {
          // provide any code that needs to be run when page
          // is replaced by another page or before JApplet is destroyed 
      }
  
      /**
       * Paint method for applet.
       * 
       * @param  g   the Graphics object for this applet
       */
      public void paint(Graphics g)
      {
          // background color
          g.setColor(Color.white);
          g.fillRect(0, 0, 150, 150);
          //draw board
          g.setColor(Color.BLACK);
          //draw vertical line
          for(int i = 50; i &lt;= 100; i = i + 50){
              g.drawLine(i,0,i,150);
          }
          //draw horizontal lines
          for(int i = 50; i &lt;= 100; i = i + 50){
              g.drawLine(0,i,150,i);
          }
          //paint x values when applicable
          g.setColor(Color.RED);
  
          for(int i = 0; i &lt; 3; i ++){
              for(int r = 0; r &lt; 3; r ++){
                  if(board[i][r] == true) g.drawString("X",j ,h );
              }
          }
  
      }
      /**
       * Called by the browser or applet viewer to inform this JApplet that it
       * is being reclaimed and that it should destroy any resources that it
       * has allocated. The stop method will always be called before destroy. 
       */
      public void destroy()
      {
          // provide code to be run when JApplet is about to be destroyed.
      }
  
      /**
       * Returns information about this applet. 
       * An applet should override this method to return a String containing 
       * information about the author, version, and copyright of the JApplet.
       *
       * @return a String representation of information about this JApplet
       */
      public String getAppletInfo()
      {
          // provide information about the applet
          return "Title:   \nAuthor:   \nA simple applet example description. ";
      }
  
      /**
       * Returns parameter information about this JApplet. 
       * Returns information about the parameters than are understood by this JApplet.
       * An applet should override this method to return an array of Strings 
       * describing these parameters. 
       * Each element of the array should be a set of three Strings containing 
       * the name, the type, and a description.
       *
       * @return a String[] representation of parameter information about this JApplet
       */
      public String[][] getParameterInfo()
      {
          // provide parameter information about the applet
          String paramInfo[][] = {
                  {"firstParameter",    "1-10",    "description of first parameter"},
                  {"status", "boolean", "description of second parameter"},
                  {"images",   "url",     "description of third parameter"}
              };
          return paramInfo;
      }
  }
  </code></pre>