title: Swapping between two JPanels in a JPanel with card layout
body: <p>I'm trying to get two jpanels to swap via buttons on those SPECIFIC panels, i don't want general buttons on both panels like normal card layout uses that repeat on both. 
  I've tried to have a button called 'add' on main panel lead to the next page and a button on next page called 'back' lead to main panel. However for some reason it isn't working. I don't want two JPanels on the JFrame because I will be adding the JPanel to a tabbed pane later. 
  Heres what I have already: </p>
  
  <p>Controller: </p>
  
  <pre><code>import java.awt.CardLayout;
  import javax.swing.*;
  import java.awt.*;
  import java.awt.event.*;
  
  public class Controller extends JPanel {
  
      private static Controller instance = new Controller();
  
      JPanel cards;
      Main mainPanel;
      NextPage nextPage;
  
      public Controller() {
          setLayout(new BorderLayout());
          setSize(810, 510);
          cards = new JPanel(new CardLayout());
  
          mainPanel = new Main();
          nextPage = new NextPage();
          cards.add(mainPanel, "Main");
          cards.add(nextPage, "Next");
          add(cards);
          setVisible(true);
      }
  
      private static void createAndShowGUI() {
          JFrame frame = new JFrame("MainPanel");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          Controller con = new Controller();
          frame.getContentPane().add(con);
          frame.setSize(800, 600);
          frame.setVisible(true);
      }
  
      public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                  createAndShowGUI();
              }
          });
      }
  
  
      public void changeCard(String card) {
          CardLayout cl = (CardLayout) (cards.getLayout());
          cl.show(cards, card);
      }
  
      public static Controller getInstance() {
          return instance;
      }
  }
  </code></pre>
  
  <p>Main: </p>
  
  <pre><code>import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  import javax.swing.event.*;
  import java.util.*;
  
  public class Main extends JPanel implements ActionListener {
  
      private JButton search, add, delete;
      private JTextField textField;
  
      public Main() {
  
          search = new JButton("Search");
          add = new JButton("Add");
          delete = new JButton("Delete");
          textField = new JTextField(20);
          add.addActionListener(this);
          delete.addActionListener(this);
          setLayout(new BorderLayout());
          JPanel top = new JPanel();
          top.add(search);
          add(top, BorderLayout.NORTH);
          JPanel bottom = new JPanel();
          bottom.add(add);
          bottom.add(delete);
          add(bottom, BorderLayout.SOUTH);
          setVisible(true);
          setSize(400, 500);
      }
  
      public void actionPerformed(ActionEvent e) {
          if (e.getSource() == add) {
              Controller.getInstance().changeCard("Next");
          } else if (e.getSource() == delete) {
             System.out.println("do something");
          }
      }
  
  }
  </code></pre>
  
  <p>For next page: </p>
  
  <pre><code>import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  import javax.swing.event.*;
  import java.util.*;
  
  public class NextPage extends JPanel implements ActionListener {
  
      private JButton back;
      private JTextField textField;
  
      public NextPage() {
          back = new JButton("Back");
          textField = new JTextField(20);
          back.addActionListener(this);
          setLayout(new BorderLayout());
          add(back);
          setVisible(true);
          setSize(400, 500);
      }
  
      public void actionPerformed(ActionEvent e) {
          if (e.getSource() == back) {
              Controller.getInstance().changeCard("Next");
          }
  
      }
  }
  </code></pre>