gpt4 book ai didi

java - 当我将 jframe 作为参数传递给另一个方法时,出现空白帧

转载 作者:行者123 更新时间:2023-12-02 03:34:28 25 4
gpt4 key购买 nike

我正在创建一个小游戏,有一个带有按钮的菜单方法可以启动实际的游戏。我只想要一帧来完成所有这些,但是当我将 jframe 作为参数传递给游戏方法时,游戏就变成了空白帧。

这是我的代码。我使用调试器并发现 Paint 方法从未被调用。

    public class GameMenu
{
public void start()
{
JFrame frame = new JFrame();
frame.setSize(480,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);


Background background = new Background(frame);
}
}

public class Background extends JPanel implements KeyListener , ActionListener
{
private JFrame frame;
private Player player1;
private ObstacleControl obsControl;
private SpeedBuffControl spdBuffControl;
private ExtraLifeControl lifeControl;
private Timer timer;
private int lifeCount;
private int xLeft;
private int xRight;
private int yDown;
private int yUp;

public Background(JFrame frame)
{
frame.add(this);
startGame();
}

public void startGame()
{
timer = new Timer(20000,this);

obsControl = new ObstacleControl(this);
spdBuffControl = new SpeedBuffControl(this);
lifeControl = new ExtraLifeControl(this);

timer.start();
player1 = new Player(this);
lifeCount = 3;
xLeft = -4;
xRight = 4;
yDown = 4;
yUp = -4;
}

public void resetPlayer()
{
if(lifeCount>1)
{
player1 = new Player(this);
obsControl.resetObstacle();
lifeCount--;
}
else
System.out.println("you are dead");
}

public void actionPerformed(ActionEvent event)
{
obsControl.increaseDifficulty();
spdBuffControl.addBuff();
lifeControl.addExtraLife();
}

public void paint(Graphics g)
{
g.setColor(new Color(149,146,240));
g.fillRect(0,0,480,600);
player1.draw(g);
obsControl.draw(g);
spdBuffControl.draw(g);
lifeControl.draw(g);
g.dispose();
repaint();
}

最佳答案

Swing 在更新布局时很懒

而不是

frame.setVisible(true);
Background background = new Background(frame);

你应该做...

Background background = new Background(frame);       
frame.setVisible(true);

但这引出了一个问题:为什么你会这么麻烦,相反,你真的应该这样做......

JFrame frame = new JFrame();
frame.setResizable(false);
frame.setSize(480,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Background());
frame.setVisible(true);

并且不将JFrame传递给Background,它不需要它

这在很多层面上都是错误的......

public void paint(Graphics g)
{
g.setColor(new Color(149,146,240));
g.fillRect(0,0,480,600);
player1.draw(g);
obsControl.draw(g);
spdBuffControl.draw(g);
lifeControl.draw(g);
g.dispose();
repaint();
}
  • 根据喜好,您应该使用 paintComponent 而不是 paint
  • 在进行任何自定义绘画之前,您应该调用方法 super 方法
  • 您不应在并非您创建的 Graphics 上下文上调用 dispose
  • 您不应在 Paint 方法中调用 repaint(或调用任何可能调用 repaint 的方法)

看看Painting in AWT and SwingPerforming Custom Painting了解更多详情

关于java - 当我将 jframe 作为参数传递给另一个方法时,出现空白帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37603373/

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