Java 无法创建新的JPanel

Java 无法创建新的JPanel,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在用Java制作Pong,我已经实现了主游戏,但我还想在开始时弹出一个菜单屏幕。我创建了菜单屏幕,但当我按下“开始游戏”按钮时,我不知道如何开始游戏。我有一个包含我的主方法的类: 公共类主{ 公共静态void main(字符串[]args) { PongRunner runner=新的PongRunner(); runner.menuScreen(); //System.out.println(“+display.getHeight()+”+display.getWidth()); } }

我正在用Java制作Pong,我已经实现了主游戏,但我还想在开始时弹出一个菜单屏幕。我创建了菜单屏幕,但当我按下“开始游戏”按钮时,我不知道如何开始游戏。我有一个包含我的主方法的类:

公共类主{
公共静态void main(字符串[]args)
{
PongRunner runner=新的PongRunner();
runner.menuScreen();
//System.out.println(“+display.getHeight()+”+display.getWidth());
}
}
我还有一门课程可以运行菜单和主游戏:

import javax.swing.JFrame;
公共类PongRunner扩展JFrame{
JFrame=新JFrame(“MLG Pong”);
公共PongRunner()
{
}
public void菜单筛选()
{
菜单=新菜单();
frame.add(菜单);
框架设置尺寸(1280720);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setresizeable(false);
}
公共无效StartName()
{
frame.removeAll();
游戏=新游戏();
frame.add(游戏);
}
}
我正在尝试这样做,当我按下按钮开始游戏时,我将调用startName()方法并清除或“删除”JFrame中的菜单JPanel,并将其替换为我游戏类中的JPanel。以下是菜单类中的actionListener:

public void actionPerformed(ActionEvent e)
{
如果(例如getActionCommand().equals(“startName”)){
重画=假;
//系统输出打印(“测试”);
PongRunner runner=新的PongRunner();
runner.startGame();
}
}

有什么办法吗?

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

另外,不要将
add
用于
JFrame
使用方法
setContentPane
设置框架的主要内容。因此,您需要
PongRunner
Menu
成为
Container
的子类,每个swing组件都是这样的)

所以代码应该是这样的:

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();
  }    
}

查看CardLayout-它可以让您一次显示一个JPanel并在它们之间切换。以下是教程:。在menuScreen方法中创建新菜单时,是否应该有一个
(this)
作为参数,因为菜单构造函数将PongRunner作为参数?