Tengo dificultades con CardLayout Manager en mi código. No puedo entender por qué recibo esta excepción. Estoy pasando una cadena en el método CardLayout.show() pero sigo recibiendo este error. Por favor ayuda. Esta es mi clase principal.

@SuppressWarnings("serial")
public class Main extends JFrame implements ActionListener {

final static String mainMenuPanel = "Main Menu";
final static String creditsPanel = "Credits";
final static String introPanel = "Introduction";

private CardLayout cardLayout = new CardLayout();
private JPanel cards = new JPanel(cardLayout);


public Main(){
    //Create and set up the window.
    super();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new CardLayout());   
    //this.pack();
    this.setVisible(true);
    this.setSize(new Dimension(800,600));
    this.setLocationRelativeTo(null);
    this.setTitle("Wise Frog Productions.");
    cards.add(new IntroGamePanel(),introPanel);
    cards.add(new MainMenu(),mainMenuPanel);
    this.add(cards);
    swapView(mainMenuPanel);

}
public void swapView(String s){
    cardLayout.show(cards,s);
}
public void actionPerformed(ActionEvent event){

}

public static void main(String[] args){
    javax.swing.SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            new Main();
        }
    });
}

Esta es mi clase externa de la que estoy intercambiando la tarjeta.

public class IntroGamePanel extends JPanel implements MouseInputListener{
private Main main;
ImageIcon beginButtonIcon1 = new ImageIcon(IntroGamePanel.class.getResource("begin_0.gif"));
ImageIcon beginButtonIcon2 = new ImageIcon(IntroGamePanel.class.getResource("begin_1.gif"));
JButton beginButton = new JButton("", beginButtonIcon1);

public IntroGamePanel(){
    super();
    this.setOpaque(true);
    this.add(beginButton);
    this.setPreferredSize(new Dimension(800,600));
    beginButton.setPreferredSize(new Dimension(200,36));
    beginButton.setLocation(240,40);
    beginButton.addMouseMotionListener(this);
    beginButton.addMouseListener(this);
    beginButton.setEnabled(true);
}

@Override
//This will take us to the main menu screen.
public void mouseClicked(MouseEvent e) {    
    if(main != null){
        main.swapView(Main.mainMenuPanel);
    }

}

@Override
public void mouseEntered(MouseEvent e) {
    beginButton.setIcon(beginButtonIcon2);      
}

@Override
public void mouseExited(MouseEvent e) {
    beginButton.setIcon(beginButtonIcon1);
}

@Override
public void mousePressed(MouseEvent e) {
    //not needed
}

@Override
public void mouseReleased(MouseEvent e) {
    //not needed
}

@Override
public void mouseDragged(MouseEvent e) {
    //not needed
}

@Override
public void mouseMoved(MouseEvent e) {
    //not needed
}
public void getMain(Main main){
    this.main = main;
}
}

Necesito ayuda con respecto a esto con bastante urgencia en realidad. :(

3
Jha 3 dic. 2011 a las 17:17
Publique también su stacktrace.
 – 
Ashwinee K Jha
3 dic. 2011 a las 17:20
Incluya el seguimiento de la pila en su pregunta y díganos qué líneas de su programa corresponden a los números de línea del seguimiento de la pila.
 – 
JB Nizet
3 dic. 2011 a las 17:23

1 respuesta

La mejor respuesta

El error viene de la línea

this.add(cards);

Dado que cambió el diseño de esto a CardLayout, debe especificar una cadena como segundo argumento.

¿Estás seguro de que querías que Main tuviera un CardLayout? Su panel cards ya contiene dicho diseño.

6
Howard 3 dic. 2011 a las 17:24
: | ... eso fue un error bastante estúpido. No, no tenía la intención de tener Main para tener un CardLayout. Si puede ayudarme con otra cosa, tengo un problema al cambiar de introPanel a mainMenuPanel. He comprobado cosas en línea, pero no puedo entender cómo hacerlo.
 – 
Jha
3 dic. 2011 a las 17:38
Estás llamando a main.swapView dentro de tu IntroGamePanel. Es un campo que nunca se inicializó. Tal vez desee pasar una referencia como argumento a su constructor de IntroGamePanel y almacenarlo en este campo.
 – 
Howard
3 dic. 2011 a las 17:44
@Jha: Esa es una pregunta aparte, ¿no? ¿Por qué no votar y aceptar la respuesta de Howard y hacer esa pregunta separada en otro lugar?
 – 
Hovercraft Full Of Eels
3 dic. 2011 a las 17:45