我在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();
}
}
关于如何做到这一点的任何想法?
答案 0 :(得分:0)
不要在动作监听器中创建新的PongRunner
。使用最初创建的实例。
此外,请勿在{{1}} add
使用方法JFrame
的情况下使用setContentPane
来设置框架的主内容。因此,您需要PongRunner
和Menu
作为每个摆动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();
}
}