gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:23:14 24 4
gpt4 key购买 nike

我创建了一个“游戏结束!”当用户在我的游戏中失败时的页面。在 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);
}
}

最佳答案

关于,

How can I create a JButton in a custom paint(Graphics g) method in java?

答案:你。切勿在任何绘画方法中创建或放置组件。这些方法仅用于渲染图像和渲染,切勿用于组件创建或程序逻辑。

这个问题是一个 XY 问题:

I have created a "Game Over!" page when the user loses in my game. Under g.drawString(...), I am trying to create a button that the user can click to restart the game. I am having trouble getting a button to appear and stay visible.

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

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

其他问题:

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

关于java - 在我的屏幕上放置重新启动按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com