在我的屏幕上放置一个重新启动按钮



当用户在我的游戏中输掉时,我创建了一个"游戏结束!"页面。在g.drawString(...)下,我正在尝试创建一个用户可以单击以重新启动游戏的按钮。我无法显示并保持可见的按钮。

如何在 Java 中的自定义 paint(Graphics g) 方法中创建 JButton?有什么建议吗?

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class Game extends JPanel implements KeyListener {
    private Player player;
    private Stage stage;
    private Stage stageLeft;
    private Stage stageRight;
    private EnemyManager manager;
    private boolean isGameOver = false;
    private boolean restart = false;
    public Game() {
        setSize(800,600);
        setPreferredSize(new Dimension(800,600));
        setFocusable(true);
        setBackground(Color.WHITE);
        requestFocus();
        addKeyListener(this);
        stage = new Stage(0, 540, 800, 100);
        stageLeft = new Stage(-1, 0, 1, 600);
        stageRight = new Stage(800, 0, 1, 600);
        player = new Player(this, 400, 400);
        manager = new EnemyManager(this, 10);
    }
    @Override
    public void update(Graphics g) {
        paint(g);
    }
    public void paint(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(0,0,getWidth(),getHeight());
        stage.draw(g);
        stageLeft.draw(g);
        stageRight.draw(g);
        if(!isGameOver || restart) {
            player.draw(g);
            manager.draw(g);
        } else {
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.WHITE);
            g.setFont(new Font("Century Gothic", Font.BOLD, 24));
            g.drawString("Game Over!", 330, 275);
            g.drawRect(330, 300, 145, 40);
            g.drawString("Restart", 350, 320);
            //TODO: Make a restart button that works
        }
        g.dispose();
        repaint();
    }
    @Override
    public void keyPressed(KeyEvent e) {
        int c = e.getKeyCode();
        if(c == KeyEvent.VK_W) {
        }
        if(c == KeyEvent.VK_A) {
            player.setxDir(-1);
        }
        if(c == KeyEvent.VK_S) {
        }
        if(c == KeyEvent.VK_D) {
            player.setxDir(1);
        }
    }
    public void setGameOver(boolean flag) {
        isGameOver = flag;
    }
    @Override
    public void keyReleased(KeyEvent e) {
        player.setxDir(0);
        player.setyDir(0);
    }
    @Override
    public void keyTyped(KeyEvent e) {
    }
    public Stage getStage() {
        return stage;
    }
    public Stage getStageLeft() { return stageLeft; }
    public Stage getStageRight() { return stageRight; }
    public EnemyManager getEnemyManager() {
        return manager;
    }
    public static void main(String[] args) {
        Game game = new Game();
        JFrame frame = new JFrame();
        frame.setTitle("Java Game");
        frame.add(game);
        frame.pack();
        frame.setPreferredSize(new Dimension(800,600));
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Center window
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

关于,

如何在 Java 中的自定义 paint(Graphics g) 方法中创建 JButton?

答:你没有。切勿在任何绘制方法中创建或放置组件。这些方法仅用于呈现图像和呈现,绝不应用于组件创建或程序逻辑。

这个问题是一个XY问题:

我创建了一个"游戏结束!"页面,当用户在我的游戏中失败时。在g.drawString(...)下,我正在尝试创建一个用户可以单击以重新启动游戏的按钮。我无法显示并保持可见的按钮。

因为您要求解决特定代码问题,而真正最好的解决方案是使用不同的方法。我建议:

  • 创建一个 JPanel,根据 Swing 绘画教程,以paintComponent方法显示背景图像,而不是以paint方法
  • 显示背景图像
  • 将您的 JButton 添加到此 JPanel 中,就像将其添加到任何 JPanel 中一样,而不是在其绘制方法中。
  • 你最好创建一个单独的JPanel来做到这一点,然后在需要时通过CardLayout交换JPanels。

其他问题:

  • 切勿释放 JVM 提供给您的图形对象。这样做会破坏绘画链。
  • 你几乎总是应该在你的覆盖中调用超级的绘画方法,以便绘画链可以继续。因此,如果您按照我的建议重写paintComponent,则应确保在自己的覆盖中调用super.paintComponent(g)方法。
  • 永远不要从绘画方法中调用repaint()。这是尝试制作动画的一种非常糟糕的方法,因为它是不可控且有风险的。
  • 不要覆盖update()因为虽然这是为 AWT 绘画完成的,但它通常不用于 Swing 图形或动画。

最新更新