title: (JAVA) Text Based Game with possible Thread.sleep() problems
body: <p>currently I am making a final project for my Advanced Programming class. The idea behind it was a text based version of the game Kingdom Hearts. In making this game I ran upon a big issue. The issue is the lag (which I presume is caused from using <strong>Thread.sleep()</strong>). I've heard that using Timers is much better than using <strong>Thread.sleep()</strong> but I was simply too ignorant to look into them.</p>
  
  <p>Game class:</p>
  
  <pre><code>import javax.swing.*;
  import java.awt.*;
  import java.awt.event.KeyAdapter;
  import java.awt.event.KeyEvent;
  import java.io.*;
  
  public class Game extends JFrame{
      static JTextArea console = new JTextArea();
      static JTextField input = new JTextField();
      ImageIcon bgImage = new ImageIcon(getClass().getResource("menu1.png"));
      ImageIcon bgImage2 = new ImageIcon(getClass().getResource("menu2.png"));
      ImageIcon bgImage3 = new ImageIcon(getClass().getResource("menu3.png"));
      static int chapter = 0, section = 0;
      static int[] saveInformation = {chapter, section};
      static int cLoc = 0;
      static int sLoc = 1;
      static boolean c1s1 = false;
      static boolean c1s3 = false;
      static boolean isChosen = false;
      JLabel bg = new JLabel(bgImage);
      boolean isMenu = true;
  public Game() throws InterruptedException {
      setTitle("Kingdom Hearts v1.24");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400, 263);
      setLocationRelativeTo(null);
      setResizable(false);
      setVisible(true);
      //MENU
      setLayout(new BorderLayout());
      setContentPane(bg);
      addKeyListener(new KeyAdapter() {
          @Override
          public void keyPressed(KeyEvent e) {
              if (e.getKeyCode() == 10) {
                  if (bg.getIcon().equals(bgImage)) {
                      isMenu = false;
                  }
                  else if (bg.getIcon().equals(bgImage2)) {
                      isMenu = false;
                      readGame("save1.txt");
                  }
                  else if (bg.getIcon().equals(bgImage3) &amp;&amp; isMenu == true) {
                      System.exit(0);
                  }
              }
              else if (e.getKeyCode() == KeyEvent.VK_UP ) {
                  if (bg.getIcon().equals(bgImage)) {
                      bgImage3.getImage().flush();
                      bg.setIcon(bgImage3);
                  }
                  else if (bg.getIcon().equals(bgImage2)) {
                      bgImage.getImage().flush();
                      bg.setIcon(bgImage);
                  }
                  else if (bg.getIcon().equals(bgImage3)) {
                      bgImage2.getImage().flush();
                      bg.setIcon(bgImage2);
                  }
              }
              else if (e.getKeyCode() == KeyEvent.VK_DOWN ) {
                  if (bg.getIcon().equals(bgImage)) {
                      bgImage2.getImage().flush();
                      bg.setIcon(bgImage2);
                  }
                  else if (bg.getIcon().equals(bgImage2)) {
                      bgImage3.getImage().flush();
                      bg.setIcon(bgImage3);
                  }
                  else if (bg.getIcon().equals(bgImage3)) {
                      bgImage.getImage().flush();
                      bg.setIcon(bgImage);
                  }
              }
          }
      });
      while (isMenu == true) {
          Thread.sleep(1000);
      }
      //IN GAME CONTENT
      setLayout(null);
      console.setEditable(false);
      add(console);
      console.setBounds(0, 0, 385, 200);
      input.setEditable(true);
      add(input);
      input.setBounds(0, 200, 385, 25);
      input.addKeyListener(new KeyAdapter() {
          @Override
          public void keyPressed(KeyEvent e) {
              if (e.getKeyCode() == 10) {
                  try {
                      activateEvent(input.getText());
                  } catch (InterruptedException e1) {
                      e1.printStackTrace();
                  }
                  input.setText("");
              }
          }
      });
      try {
          activateEvent("intro");
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
  }
  private void readGame(String filePath) {
      File inputFile;
      BufferedReader inputReader;
  
      try {
          inputFile = new File(filePath);
          inputReader = new BufferedReader(new FileReader(inputFile));
          for (int i = 0; i &lt; saveInformation.length; i++) {
              saveInformation[i] = Integer.parseInt(inputReader.readLine());
          }
          chapter = saveInformation[cLoc];
          section = saveInformation[sLoc];
          inputReader.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  public static void saveGame(String filePath) {
      File outputFile;
      BufferedWriter outputWriter;
  
      try {
          outputFile = new File(filePath);
  
          outputWriter = new BufferedWriter(new FileWriter(outputFile));
  
          saveInformation[cLoc] = chapter;
          saveInformation[sLoc] = section;
  
          for (int i = 0; i &lt; saveInformation.length; i++) {
              outputWriter.write(Integer.toString(saveInformation[i]));
              outputWriter.newLine();
          }
  
          outputWriter.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  public static void main(String[] args) throws InterruptedException {
      new Game();
  }
  public static void clearConsole() {
      console.setText("");
  }
  public static void addToConsole(String anotherString) {
      console.append(anotherString);
  }
  public static void toConsole(String anotherString) {
      clearConsole();
      addToConsole(anotherString);
  }
  public void activateEvent(String anotherString) throws InterruptedException {
      Events event = new Events();
      try {
          event.EventList(anotherString);
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
  }
  public static void slowPrintToConsole(String message, long millisPerChar)
  {
      for (int i = 0; i &lt; message.length(); i++)
      {
          addToConsole(Character.toString(message.charAt(i)));
  
          try
          {
              Thread.sleep(millisPerChar);
          }
          catch (InterruptedException e)
          {
              e.printStackTrace();
          }
      }
    }
  }
  </code></pre>
  
  <p>Events class:</p>
  
  <pre><code>public class Events {
  boolean isLoaded = false;
  public Events() {
  
  }
  public void EventList(String s) throws InterruptedException {
      String event = s;
      if (event.equalsIgnoreCase("intro")) {
          try {
              Play(Game.chapter, Game.section);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
      else if (event.equalsIgnoreCase("save")) {
          Game.saveGame("save1.txt");
      }
      else if (event.equalsIgnoreCase("move forward")) {
          if (Game.chapter == 1 &amp;&amp; Game.section == 1) {
              Game.c1s1 = true;
          }
      }
      else if (event.equalsIgnoreCase("move help") &amp;&amp; ((Game.chapter == 1 &amp;&amp; Game.section == 1))) {
          Game.toConsole("VALID LOCATIONS: ");
          if (Game.chapter == 1 &amp;&amp; Game.section == 1) {
              Game.addToConsole("'FORWARD'");
          }
      }
      else if (event.equalsIgnoreCase("shield") &amp;&amp; Game.chapter == 1 &amp;&amp; Game.section == 3) {
          Game.isChosen = true;
          Game.c1s3 = true;
          Game.clearConsole();
          Game.slowPrintToConsole("The power of the guardian.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\nKindness to aid friends.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\nA shield to repel all.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\n\nIs this the power you seek?", 50);
          Game.c1s3 = false;
      }
      else if (event.equalsIgnoreCase("sword") &amp;&amp; Game.chapter == 1 &amp;&amp; Game.section == 3) {
          Game.isChosen = true;
          Game.clearConsole();
          Game.slowPrintToConsole("The power of the warrior.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\nInvincible courage.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\nA sword of terrible destruction.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\n\nIs this the power you seek?", 50);
      }
      else if (event.equalsIgnoreCase("staff") &amp;&amp; Game.chapter == 1 &amp;&amp; Game.section == 3) {
          Game.isChosen = true;
          Game.clearConsole();
          Game.slowPrintToConsole("The power of the mystic.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\nInner strength.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\nA staff of wonder and ruin.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\n\nIs this the power you seek?", 50);
      }
      else if (event.equalsIgnoreCase("y") || event.equalsIgnoreCase("yes")) {
          if (Game.chapter == 1 &amp;&amp; Game.section == 3 &amp;&amp; Game.isChosen == true) {
              Game.clearConsole();
              Game.section = 4;
              Play(1, 4);
          }
      }
      else if (event.equalsIgnoreCase("n") || event.equalsIgnoreCase("no")) {
          if (Game.chapter == 1 &amp;&amp; Game.section == 3 &amp;&amp; Game.isChosen == true) {
              Game.clearConsole();
              Game.toConsole("Sword, Staff, and Shield.\nChoose well.");
          }
      }
      else {
          System.out.println("Invalid command.");
      }
      if (isLoaded == false) {
          isLoaded = true;
          if (Game.section &lt; 1 &amp;&amp; Game.chapter &lt; 1) {
          }
      }
  
  }
  public void Play(int chapter, int section) throws InterruptedException {
      // INTRO
      if (section == 0 &amp;&amp; chapter == 0) {
          Thread.sleep(500);
          Game.slowPrintToConsole("Sora: ", 50);
          Thread.sleep(1000);
          Game.slowPrintToConsole("I've been having these weird thoughts lately...", 50);
          Thread.sleep(4000);
          Game.clearConsole();
          Game.toConsole("Sora: ");
          Thread.sleep(500);
          Game.slowPrintToConsole("Like, ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("is any of this for real...", 50);
          Thread.sleep(1000);
          Game.slowPrintToConsole(" or not?", 50);
          Thread.sleep(4000);
          Game.clearConsole();
          Game.slowPrintToConsole("You feel as though you are falling.", 100);
          Thread.sleep(3000);
          Game.clearConsole();
          Game.slowPrintToConsole("As you begin to wake,", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole(" you get the feeling of being underwater. ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("You see \nan increasingly bright light and you appear on a beach.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole(" The sun is \nshining in your eyes, but you notice your friend Riku in the water facing \nthe opposite direction.", 50);
          Thread.sleep(3000);
          Game.clearConsole();
          Game.slowPrintToConsole("Before attempting to sneak up on him, you realize just how far out he \nis in the water.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("A large wave begins to build up. ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("Riku calmly turns to you and reaches \nout his hand.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole(" You rush to your friend but are knocked back by the wave.\n", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("Upon opening your eyes while underwater, ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("you notice Riku is still \nstanding with his hand extended.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("You attempt to grab his hand but the current is too strong and pushes \nyou back.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("While floating back up, you notice the sun is now setting. ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("Upon \nsurfacing, your friend Kairi can be seen waving to you.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("You wave back happily and make your way towards her. ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("She smiles.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("Out of breath. you greet her with a smile.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("Kairi giggles but immediately aims her attention to something else.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("You turn your head to see what she is looking at, ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("only to see what \nlooks like yourself falling from the clouds, followed by shooting stars.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("The more you watch, the more unbalanced you feel. ", 100);
          Thread.sleep(3000);
          Game.clearConsole();
          Game.slowPrintToConsole("You fall backwards into the water.", 75);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("The water is deeper than before, so you just keep sinking.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("Kairi desperately tries to grab you but you are too far down.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("You fall asleep again.", 100);
          Thread.sleep(4000);
          Game.clearConsole();
          Thread.sleep(1000);
          Game.slowPrintToConsole("You wake up, still underwater. ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("You are so deep that you cannot see the \nsun, but you can feel the ground.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("Surrounded by darkness, you take your first step.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("The darkness of the ground transforms into doves which fly away. ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("As \nthe darkness disappears, the floor begins to reveal a stained glass \nplatform depicting Snow White.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Thread.sleep(1000);
          Game.slowPrintToConsole("Is this a dream?", 100);
          Thread.sleep(3000);
          Game.clearConsole();
          Game.chapter = 1;
          Play(1, 0);
      }
      // CHAPTER 1 SECTION 0
      if (chapter == 1 &amp;&amp; section == 0) {
          Thread.sleep(2000);
          Game.slowPrintToConsole("Chapter 1: Awakening.", 100);
          Thread.sleep(3000);
          Game.clearConsole();
          Thread.sleep(2000);
          Game.slowPrintToConsole("So much to do, ", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("so little time...", 50);
          Thread.sleep(1000);
          Game.clearConsole();
          Thread.sleep(500);
          Game.slowPrintToConsole("Take your time.", 50);
          Thread.sleep(1500);
          Game.clearConsole();
          Game.slowPrintToConsole("Don't be afraid.", 50);
          Thread.sleep(1000);
          Game.clearConsole();
          Thread.sleep(1000);
          Game.slowPrintToConsole("The door is still shut.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("Now, step forward.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\nCan you do it?", 50);
          Thread.sleep(3000);
          Game.clearConsole();
          Game.section = 1;
          Play(1, 1);
      }
      // CHAPTER 1 SECTION 1
      if (chapter == 1 &amp;&amp; section == 1) {
          Game.toConsole("Use 'MOVE' to navigate around your current surroundings.\nTo find valid locations to move, use 'MOVE HELP'.");
          while (Game.c1s1 == false) {
              Thread.sleep(1000);
          }
          Game.clearConsole();
          Game.section = 2;
          Play(1, 2);
      }
      //CHAPTER 1 SECTION 2
      if (chapter == 1 &amp;&amp; section == 2) {
          Game.slowPrintToConsole("As you walk forward, three pedestals rise from the ground.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("Power sleeps within you.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("If you give it form...", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("It will give you strength.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.slowPrintToConsole("Above each pedestal holds an item.", 50);
          Thread.sleep(2000);
          Game.clearConsole();
          Game.section = 3;
          Play(1, 3);
      }
      //CHAPTER 1 SECTION 3
      if (Game.chapter == 1 &amp;&amp; Game.section == 3 &amp;&amp; Game.c1s3 == false) {
          Game.slowPrintToConsole("Sword, Staff, and Shield.", 50);
          Thread.sleep(500);
          Game.slowPrintToConsole("\nChoose well.", 50);
          Game.c1s3 = true;
      }
      //CHAPTER 1 SECTION 4
      if (Game.chapter == 1 &amp;&amp; Game.section == 4) {
          System.out.println("Everything worked successfully.");
      }
    }
  }
  </code></pre>
  
  <p><strong>ANY</strong> input would be great, whether it be that I'm making a really dumb mistake or a small mistake. Thanks!</p>