Analysis
You simply want the JComponents to be displayed on the JFrame. We can achieve this by using a single JPanel, but adding and removing the JComponents from it, during the JButton's action listener.
Without looking at your actual code, it is better to make a manageable way to reach code and instantiated Objects. The code listed below, creates a nice and manageable way to do so.
Achieving This
The entire class is listed below with comments for explanations.
package swing;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
    public class MultiPaneledFrame {
        JFrame frame = new JFrame();
        JPanel window = new JPanel();
        // As you can see, we create an array containing all your JComponents.
        // We have two of these, to simulate multiple JPanel's.
        List<JComponent> window1Contents = new ArrayList<JComponent>();
        List<JComponent> window2Contents = new ArrayList<JComponent>();
        // NOTE: The above Lists can instead be stuck in their own class like asked for,
        // and instantiated on Class invocation.
        JButton goto2 = new JButton("Goto Panel 2");
        JButton goto1 = new JButton("Goto Panel 1");
        int panelToShow = 0; // 0 - First "panel".
                               // 1 - Second "panel".
        // Main method of class. Change 'Multi_Paneled_Frame' to the name of your Class.
        public MultiPaneledFrame() {
            // Execute anything else you want here, before we start the frame.
            window1Contents.add(goto2);
            window2Contents.add(goto1);
            // Here is where I personally am setting the coordinates of the JButton's on the JPanel.
            goto2.setPreferredSize(new Dimension(200, 100));
            goto1.setPreferredSize(new Dimension(200, 100));
            //goto2.setBounds(5, 5, 150, 30); < Used for 'null' layout.
            //goto1.setBounds(5, 5, 150, 30); < Used for 'null' layout.
            goto2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    addComponents(panelToShow = 1);
                }
            });
            goto1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    addComponents(panelToShow = 0);
                }
            });
            initialiseFrame();
        }
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new MultiPaneledFrame();
                }
            });
        }
        private void initialiseFrame() {
            frame.setSize(600, 400); // Change it accordingly.
            // Optional
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
            // Needed
            frame.setVisible(true);
            frame.add(window);
            window.setLayout(new BorderLayout()); // Assuming your using a BorderLayout.
            //window.setLayout(null); < Uses 'null' layout.
            addComponents(panelToShow);
            // I always like to make sure that everything is on the frame nicely.
            frame.repaint();
            frame.validate();
        }
        private void addComponents(int panelNo) {
            if (panelNo == 0) {
                for (JComponent component : window1Contents) {
                    window.removeAll(); // We're removing everything that it contains and replacing it...
                    window.revalidate();
                    window.add(component, BorderLayout.CENTER);
                    //window.add(component); < Uses 'null' layout.
                    // Since we are using the first panel, we are adding
                    // everything from the first list of components to the window...
                }
            } else {
                for (JComponent component : window2Contents) {
                    window.removeAll(); // We're removing everything that it contains and replacing it...
                    window.revalidate();
                    window.add(component, BorderLayout.CENTER);
                    //window.add(component); < Uses 'null' layout.
                    // Since we are using the second panel, we are adding
                    // everything from the second list of components to the window...
                }
            }
            // Refreshes the frame.
            frame.repaint();
            frame.validate();
        }
    }
Conclusion
Although there are countless ways to achieve something like this, the way I have given, is semi-efficient, and very flexible. Feel free to edit the code, or drop a question if you have any concerns, and I will be happy to respond.
PS: This code was tested and works on a Macbook Air running OS X 10.11 and Java Version 8 Update 65.