游戏结束后添加重启按钮

时间:2014-12-28 13:10:33

标签: java swing button

我是Java.Swing的初学者,并尝试根据我在互联网上找到的一个例子制作我自己的Snake游戏,因此通过这个过程学习。一切都很好,游戏工作,但现在我正在尝试在"游戏中添加一个重启按钮。屏幕。该计划的结构如下:

主程序

public Snake() {
    add(new Board());
    setResizable(false);
    pack();
    setTitle("Snake");
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame ex = new Snake();
            ex.setVisible(true);
        }
    });

}

董事会:(试图仅粘贴相关代码)

Board() {
    initializeVariables();
    addKeyListener(new EventHandler()); 
    setBackground(Color.black);
    setFocusable(true);
    setPreferredSize(new Dimension(BOARD_WIDTH, BOARD_HEIGHT));
    loadImages();

    timer = new Timer(delay, this);
    timer.start();
}

使用以下方法覆盖:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    doDrawing(g);
}
@Override
public void actionPerformed(ActionEvent e) {
    ///
    repaint();
}

当游戏结束时,蛇不再被绘制,但在paintComponent / doDrawing中调用以下方法:

private void gameOver(Graphics g) {
    String msg = "Game Over";
    String msg2 = "New Game?";
    Font small = new Font("Helvetica", Font.BOLD, DOT_SIZE);
    FontMetrics metr = getFontMetrics(small);

    g.setColor(Color.white);
    g.setFont(small);
    g.drawString(msg, (BOARD_WIDTH - metr.stringWidth(msg)) / 2, BOARD_HEIGHT / 2);

    g.drawString(msg2, (BOARD_WIDTH - metr.stringWidth(msg)) / 2, (BOARD_HEIGHT / 2) + DOT_SIZE*2);}

真的,我需要的是第二个字符串"新游戏?"响应并重新启动游戏。我该怎么做?

当然,我想过使用JButton。但是,我仍然不确定JFrame和JPanel是如何工作的。我尝试在actionPerformed()中创建按钮,仅在游戏结束时使用add()将其添加到屏幕上。它没有显示,我相信原因是JPanel已经占据了整个屏幕(JFrame?),因此需要在它之后绘制Button,但这将在JFrame之外。

我对如何进一步采取任何建议?

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试使用

   dispose();  

   EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        JFrame ex = new Snake();
        ex.setVisible(true);
    }
});

我不知道这只是一个假设我会在重播方法的核心上尝试它

欢迎使用更多代码以帮助您

答案 1 :(得分:0)

我通过在调用Board()时添加按钮来处理它,但将其设置为"隐藏"并且只在游戏结束时显示(并启用它)。方法:

private void addRestartButton() {
    String buttonText = "New Game?";
    restartButton = new JButton(buttonText);
    Font font = new Font("Helvetica", Font.BOLD, size);
    restartButton.setFont(font);

    setLayout(null);
    restartButton.setBounds(x,y,w,z);
    add(restartButton);

    restartButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            restart();
        }
    });  

    setButtonVisibility(false);
}

我不确切地知道为什么按钮没有出现在第一位;也许它不能在程序的后期添加?或者默认情况下可见性设置为false。由于我只是尝试这样做并且它起作用,我没有回去看看为什么。无论如何,这是我的一些发现:

  • 即使计时器停止,也会调用repaint()方法
  • 我必须先使用setLayout(null)来重新定位按钮
  • 按钮需要自己的actionListener(现在看来很明显)

我相信下一步是通过为每个屏幕制作一个单独的JPanel(所以开始页面,游戏,结束游戏)以及处理主Snake()程序中的面板更改来重构整个游戏。