Java 在我的屏幕上放置重新启动按钮
当用户在我的游戏中失败时,我创建了一个“游戏结束!”页面。在g.drawString(…)下,我试图创建一个按钮,用户可以单击该按钮重新启动游戏。我很难让按钮出现并保持可见 如何在Java中的自定义绘制(Graphics g)方法中创建JButton?有什么建议吗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
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()
- 不要覆盖
,因为这是为AWT绘制完成的,但通常不用于Swing图形或动画李>update()