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

Java 在我的屏幕上放置重新启动按钮,java,swing,graphics,jbutton,Java,Swing,Graphics,Jbutton,当用户在我的游戏中失败时,我创建了一个“游戏结束!”页面。在g.drawString(…)下,我试图创建一个按钮,用户可以单击该按钮重新启动游戏。我很难让按钮出现并保持可见 如何在Java中的自定义绘制(Graphics g)方法中创建JButton?有什么建议吗 import java.awt.event.*; import javax.swing.*; import java.awt.*; public class Game extends JPanel implements KeyLis

当用户在我的游戏中失败时,我创建了一个“游戏结束!”页面。在g.drawString(…)下,我试图创建一个按钮,用户可以单击该按钮重新启动游戏。我很难让按钮出现并保持可见

如何在Java中的自定义绘制(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中的自定义绘制(Graphics g)方法中创建JButton

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

这个问题是一个XY问题:

当用户在我的游戏中失败时,我创建了一个“游戏结束!”页面。在g.drawString(…)下,我试图创建一个按钮,用户可以单击该按钮重新启动游戏。我很难让按钮出现并保持可见

在这种情况下,您需要一个特定代码问题的解决方案,而真正的最佳解决方案是使用不同的方法。我建议:

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

  • 永远不要处理JVM提供给您的图形对象。这样做会打破绘画链条
  • 您几乎应该始终在覆盖内部调用super的绘制方法,以便绘制链可以继续。因此,如果按照我的建议重写
    paintComponent
    ,您应该确保在自己的重写中调用
    super.paintComponent(g)
    方法
  • 切勿从绘制方法中调用
    repaint()
    。这是一种非常糟糕的尝试制作动画的方式,因为它是不可控的,而且有风险
  • 不要覆盖
    update()
    ,因为这是为AWT绘制完成的,但通常不用于Swing图形或动画
感谢您的快速回复。我会考虑所有这些,看看我能从这场比赛中得到什么。我对Java开发非常陌生,这对我很有帮助。我的CardLayout工作正常,一切看起来都很好,但我的关键输入不再工作。你知道有什么解决办法吗?我一直在研究它,但我发现似乎没有什么能起作用。@TheAnonymous010:是的,使用键绑定,而不是键侦听器。这应该是我的建议之一,因为键绑定更加灵活和宽容。装满鳗鱼的气垫船提供了一些极好的建议。看一看我的文章,看看如何用游戏图片来布局游戏,以及在哪里放置重启按钮。