我有一个扩展JFrame的Window类。该窗口具有扩展JPanel的Game类的实例。窗口将游戏存放在JPanel中,并相应地显示它。游戏使用run()方法运行,直到满足残局标准为止。
我必须实现一个按钮(在JMenu中),无论我是否完成游戏,只要我单击它,它就会重新启动游戏。
如何从Window类重新启动游戏?我尝试将EventListener添加到JMenu按钮,并且在单击并发生以下情况时设法使游戏重新启动: 游戏重新启动(在后台运行良好),但未显示任何内容(显示了先前游戏的最后一个“帧”)。在EventListener范围结束之后-因为我从那里调用的新游戏结束了-所以显示了新游戏的最后一个“帧”。简而言之:出于某种原因,当从EventListener的作用域调用时,它什么也不显示。
Barebones窗口类:
public class Window extends JFrame implements ActionListener {
Game game;
JMenuBar menuBar;
JMenu menu;
JMenuItem newGame, highScores;
public Window() {
//Menu
menuBar = new JMenuBar();
menu = new JMenu("Menu");
menuBar.add(menu);
newGame = new JMenuItem("New Game");
highScores = new JMenuItem("Highscores");
newGame.addActionListener(this);
highScores.addActionListener(this);
menu.add(newGame);
menu.add(highScores);
setJMenuBar(menuBar);
//Components
counter.setFont(new Font("Monaco", Font.PLAIN, 35));
counter.setHorizontalAlignment(JLabel.CENTER);
JPanel abovePane = new JPanel();
abovePane.setLayout(new BorderLayout());
this.getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
abovePane.add(counter, BorderLayout.PAGE_START);
abovePane.add(timerLabel, BorderLayout.CENTER);
getContentPane().add(abovePane, BorderLayout.PAGE_START);
game = new Game();
getContentPane().add(game, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setLocation(dim.width / 2 - getSize().width / 2, dim.height / 2 - getSize().height / 2);
setVisible(true);
game.initGame();
addKeyListener(new KeyboardListener());
game.run();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == newGame) {
game = new Game();
getContentPane().add(game, BorderLayout.CENTER);
game.initGame();
game.run();
}
}
}