title: How can I switch between jpanels?
body: <p>I'm still very new to java programming, so please help me to correct any mistakes I might have overlooked or give tips on how to improve this program.</p>
  
  <p>Okay, so a lot of problems have been solved, and now I have a CardLayout, but I still have questions about how I should make my pipes show inside it.</p>
  
  <p>When I tried to add in my refresh rate timer and my speed timer, I have problems about how I need to declare and initialize boolean variables.</p>
  
  <p>Also, when I compile and run this game, I get files such as <code>Game$1.class</code>. Is there a way for me to clean this up, and could someone explain why this happens?  Do these have an affect on the finished product? (When the game is compiled and packaged into a JAR.)</p>
  
  <p>I want to set playerIsReady to true when the play button is clicked. And from there, when the if statement is true, then switch to a panel that displays the pipes, and start moving the pipe across the screen. Preferably 3 instances of that pipe, each starting at different times, but whatever you can help with is fine.</p>
  
  <p>Some of this code needs work, so I have commented some parts out and left notes.</p>
  
  <p>My other questions about this game can be found <a href="https://stackoverflow.com/questions/21587972/how-can-i-scroll-more-than-one-object-at-the-same-time">here</a>.</p>
  
  <p>This is my <strong>current</strong> code</p>
  
  <p>Game.java</p>
  
  <pre><code>import java.awt.*;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import javax.swing.*;
  import javax.swing.JFrame;
  import javax.swing.JPanel;
  import javax.swing.Timer;
  import javax.swing.border.EmptyBorder;
  import javax.swing.SwingUtilities;
  
  public class Game {
  
      public static void main(String[] args) {
          Runnable r = new Runnable() {
              @Override
              public void run() {             
                  // the GUI as seen by the user (without frame)
                  final CardLayout cl = new CardLayout();
                  final JPanel gui = new JPanel(cl);
                  // remove if no border is needed
                  gui.setBorder(new EmptyBorder(10,10,10,10));
  
                  JPanel menu = new JPanel(new GridBagLayout());
                  JButton playGame = new JButton("Play!");
                  ActionListener playGameListener = new ActionListener() {
  
                      @Override
                      public void actionPerformed(ActionEvent e) {
                          cl.show(gui, "game");
                      }
                  };
                  playGame.addActionListener(playGameListener);
                  Insets margin = new Insets(20, 50, 20, 50);
                  playGame.setMargin(margin);
                  menu.add(playGame);
                  gui.add(menu);
                  cl.addLayoutComponent(menu, "menu");
  
                  final JPanel pipes = new Pipes();
                  gui.add(pipes);
                  cl.addLayoutComponent(pipes, "game");
  
                  JFrame f = new JFrame("Pipes Game");
                  f.add(gui);
                  // Ensures JVM closes after frame(s) closed and
                  // all non-daemon threads are finished
                  f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                  // See https://stackoverflow.com/a/7143398/418556 for demo.
                  f.setLocationByPlatform(true);
  
                  // ensures the frame is the minimum size it needs to be
                  // in order display the components within it
                  f.pack();
                  // should be done last, to avoid flickering, moving,
                  // resizing artifacts.
                  f.setVisible(true);
  
                  /*if (playerIsReady) { 
                      Timer speed = new Timer(10, new ActionListener() {  //pipe speed
                          @Override
                          public void actionPerformed(ActionEvent e) {
                              pipes.move();
                          }
                      });
                      speed.start();
  
                      Timer refresh = new Timer(30, new ActionListener() {    //refresh rate
                          @Override
                          public void actionPerformed(ActionEvent e) {
                              pipes.repaint();
                          }
                      });
                      refresh.start();
                  }*/
              }
          };
          // Swing GUIs should be created and updated on the EDT
          // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
          SwingUtilities.invokeLater(r);
      }
  }
  </code></pre>
  
  <p>Pipes.java</p>
  
  <pre><code>// What import(s) do I need for ArrayList?
  public class Pipes {
      List&lt;Pipe&gt; pipes = new ArrayList&lt;Pipe&gt;();
  
      public Pipes() {
          pipes.add(new Pipe(50, 100));
          pipes.add(new Pipe(150, 100));
          pipes.add(new Pipe(250, 100));
      }
  
      protected void paintComponent(Graphics g) {
          super.paintComponent(g);
  
          for ( Pipe pipe : pipes ){
              pipe.drawPipe(g);
          }
      }
  }
  </code></pre>
  
  <p>PipeObject.java</p>
  
  <pre><code>import java.awt.Graphics;
  
  public class PipeObject {
      //Declare and initialiaze variables
      int x1 = 754;               //xVal start
      int x2 = 75;                //pipe width
                                  //total width is 83
      int y1 = -1;                //yVal start
      int y2 = setHeightVal();    //pipe height
      int gap = 130;              //gap height
  
      public void drawPipe(Graphics g) {
  
          g.clearRect(0,0,750,500);                       //Clear screen
          g.drawRect(x1,y1,x2,y2);                        //Draw part 1
          g.drawRect(x1-3,y2-1,x2+6,25);                  //Draw part 2
          g.drawRect(x1-3,y2+25+gap,x2+6,25);             //Draw part 3
          g.drawRect(x1,y2+25+gap+25,x2,500-y2-49-gap);   //Draw part 4
      }
  
      public void move() {
          x1--;
      }
  
      public int getMyX() {   //To determine where the pipe is horizontally
          return x1-3;
      }
  
      public int getMyY() {   //To determine where the pipe is vertically
          return y2+25;
      }
  
      public int setHeightVal() {     //Get a random number and select a preset height
          int num = (int)(9*Math.random() + 1);
          int val = 0;
          if (num == 9)
          {
              val = 295;
          }
          else if (num == 8)
          {
              val = 246;
          }
          else if (num == 7)
          {
              val = 216;
          }
          else if (num == 6)
          {
              val = 185;
          }
          else if (num == 5)
          {
              val = 156;
          }
          else if (num == 4)
          {
              val = 125;
          }
          else if (num == 3)
          {
              val = 96;
          }
          else if (num == 2)
          {
              val = 66;
          }
          else
          {
              val = 25;
          }
          return val;
      }
  }
  </code></pre>