无法创建新的JPanel

时间:2015-02-23 17:55:28

标签: java swing jframe jpanel

我在Java中制作Pong,我已经实现了主游戏,但我也希望在开始时弹出一个菜单屏幕。我创建了菜单屏幕,但是当我按下"开始游戏时,我无法弄清楚如何启动游戏"按钮。我有一个包含我的主要方法的类:

public class main {
    public static void main(String[]args)
    {
        PongRunner runner = new PongRunner();
        runner.menuScreen();


      //System.out.println(""+display.getHeight()+" "+display.getWidth());

    }

}

我还有一个用于运行菜单和主游戏的课程:

import javax.swing.JFrame;


public class PongRunner extends JFrame{
    JFrame frame = new JFrame("MLG Pong");
    public PongRunner()
    {

    }

    public void menuScreen()
    {
        Menu menu = new Menu();
        frame.add(menu);
        frame.setSize(1280,720);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
    }

    public void startGame()
    {
        frame.removeAll();
        game game = new game();
        frame.add(game);
    }

}

当我按下按钮开始游戏时,我试图这样做,我将调用startGame()方法并清除,或者"删除",我的JFrame中的菜单JPanel并从我的游戏类中用JPanel替换它。这是菜单类中的actionListener:

public void actionPerformed(ActionEvent e)
    {
        if(e.getActionCommand().equals("startgame")){
            redraw = false;
            //System.out.println("test");
            PongRunner runner = new PongRunner();
            runner.startGame();
        }
    }

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:0)

不要在动作监听器中创建新的PongRunner。使用最初创建的实例。

此外,请勿在{{1​​}} add使用方法JFrame的情况下使用setContentPane来设置框架的内容。因此,您需要PongRunnerMenu作为每个摆动JComponent的Container的子类。

所以代码应该是:

public class main {
  public static void main(String[]args) {
    PongRunner runner = new PongRunner();
    runner.menuScreen();
  }
}

public class game extends ... { // should extends at least Container
}

public class Menu extends JPanel implements ActionListener {
  private PongRunner theRunner;
  public Menu(PongRunner p) {
    theRunner = p;
    JButton b = new JButton("Start");
    b.setActionCommand("startgame");
    this.add(b);
    b.addActionListener(this);
  }
  public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().equals("startgame")) {
      theRunner.startGame();
    }
  }
}

public class PongRunner extends JFrame {
  JFrame frame = new JFrame("MLG Pong");
  public void menuScreen() {
    Menu menu = new Menu(this);
    frame.setContentPane(menu);
    frame.setSize(1280,720); // don't use such a thing, set the preferred size of the contentPane to a desired value
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
  }
  public void startGame() {
    frame.setContentPane(new game());
    frame.pack();
  }    
}