Cambiando entre JPanels

Estoy tratando de hacer un juego. Hay varias pantallas diferentes en el juego, como un menú principal y la pantalla del juego real. Cada uno de estos es una extensión jpanel separada. He agregado cada uno de ellos a mi JFrame, que es una clase llamada Juego. En mi clase de juego tengo los siguientes métodos

public void addPanel( JPanel p ) {
    panels.add( p ); // An array of all the different panels I need
    this.getContentPane().add( p );
}

public void switchToPanel( JPanel p ) {
    for ( JPanel somePanel : panels ) {
        somePanel.setVisible( false );
    }

    p.setVisible( true );
    repaint();
}

El punto de esto es que tengo muchos paneles diferentes y cuando necesito mostrar uno en particular, como una pantalla de menú, llamo switchToPanel (myPanel). Básicamente simplemente ocultando cada panel y luego mostrando el panel que necesito ver. El único problema es que estos paneles no aparecen cuando los cambio. El único que se mostrará es el panel que agregué por última vez. En Objective C, uso esta técnica para cambiar de vista todo el tiempo y nunca he tenido ningún problema. ¿Este tipo de cosas no están permitidas en java?

Edit: ahora estoy llamando repaint () después de cambiar, pero todavía no funciona

Respuestas a la pregunta(3)

Su respuesta a la pregunta