Question

I'm nearing the final development stages of my first game, but have run into a problem. I've constructed 4 different levels and allow the user to select the level they want to play from a central JPanel in a Card Layout system. My problem is that once a level is completed, I can't switch the JPanel which is displayed to start the next level, since I don't know how to access the original JPanel which acts as a driver for the other panels. Any help is appreciated, and my code is posted bellow.

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

   public class MainFrame extends JFrame implements ActionListener
      {
         JPanel bodyPanel;
         JPanel panel1,panel2,panel3,panel4,panel5;
         JButton button1,button2,button3,button4,button5;
         JLabel title;
         Container con;
         CardLayout clayout;


      public MainFrame() 
   {
    clayout=new CardLayout();
    bodyPanel=new JPanel(clayout);

    button1=new JButton("Level 1");
    button3= new JButton("Level 2");
    button4 = new JButton("Level 3");
    button2=new JButton("Exit");
    button5 = new JButton("Level 4");


    button1.addActionListener(this);
    button2.addActionListener(this);
    button3.addActionListener(this);
    button4.addActionListener(this);
    button5.addActionListener(this);


    panel1=new JPanel();
        title = new JLabel("Space Adventure");
        panel1.add(title);
        title.setFont(new Font("Serif", Font.PLAIN, 110));
        panel1.add(button1);
        panel1.add(button3);
        panel1.add(button4);
        panel1.add(button5);
        panel1.add(button2);



    panel1.setBackground(Color.pink);
    panel2=new PrizePanel();
    panel2.setBackground(Color.gray);



    bodyPanel.add(panel1,"one");    
    bodyPanel.add(panel2,"two");    


    setLayout(new BorderLayout());
    setSize(800,400);
    add(bodyPanel,BorderLayout.CENTER);
    bodyPanel.setBounds(0,100, 600, 500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

}

      public static void main(String args[])
      {
          new MainFrame();
      }

      public void actionPerformed(ActionEvent e) {

          if(e.getSource()==button1)
          {
           clayout.show(bodyPanel, "two");
              panel2.requestFocusInWindow();
           }else if(e.getSource()==button3)
          {
          panel3=new PrizePanel2();
          panel3.setBackground(Color.gray);
          bodyPanel.add(panel3,"three");
          clayout.show(bodyPanel, "three");
          panel3.requestFocusInWindow();
           }
           else if(e.getSource()==button4)
          {
          panel4=new PrizePanel3();
          panel4.setBackground(Color.gray);
          bodyPanel.add(panel4,"four");
          clayout.show(bodyPanel, "four");
          panel4.requestFocusInWindow();
           }else if(e.getSource()==button5)
          {
          panel5=new PrizePanel4();
          panel5.setBackground(Color.gray);
          bodyPanel.add(panel5,"five");
          clayout.show(bodyPanel, "five");
          panel5.requestFocusInWindow();
           }


          else if(e.getSource()==button2)
          {
             System.exit(0);
          }

      }

}
Was it helpful?

Solution 2

Thanks to everyone who took the time to look over this. I ended up just making a static function to swap panels so that it could be called from any class.

public static void swap(int x){
  switch(x){
     case 1:
       clayout.show(bodyPanel, "two");
          panel2.requestFocusInWindow();
          break;
       case 2:
      clayout.show(bodyPanel, "three");
      panel3.requestFocusInWindow();
       break;
       case 3:
       panel3 = null;
      clayout.show(bodyPanel, "four");
      panel4.requestFocusInWindow();
      break;
       case 4:
       panel4=null;
      clayout.show(bodyPanel, "five");
      panel5.requestFocusInWindow();
       break;
     }
  }

OTHER TIPS

Start by adding all the "game" panels to the bodyPanel at the start and then simply using clayout.show to switch between them. If you need to, supply a reset method to reset the "game" panel before you switch to it.

Use a callback interface that would be passed to each "game" panel. When they have completed their level, it would call this interface, telling the implementation that the level was completed and the implementation would then decide how to switch the next panel in.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top