在JFrame中连续显示和重绘多个游戏视图(组件)的最佳方式



我有一个问题无法理解,也无法解决。

我正在制作一个小行星的复制品(为了聪明起见,我称之为流星)。目前我有一个名为MeteorGame的类,它是绘制GUI的主要类。MeteorGame扩展了JFrame以创建窗口,并且它还有另一个用于解释键盘事件的类。一切都很好,但我需要扩大规模。基本上,我所创造的只是游戏的一个"关卡",现在我需要一个关卡管理员。我将这个类称为Meteors,我希望IT处理创建JFrame,而不是MeteorGame。

因此,我试图创建一个系统,在这个系统中,Meteors类基本上是一个外壳,它创建了一个窗口,并按顺序实例化MeteorGame的"级别"。我已经将MeteorGame类从JFrame转换为JPanel,这样我的JFrame Meteors类就可以在用户升级时将JPanel组件添加到自己中。

我希望每个MeteorGame都能完全自主地绘制自己并解释键盘事件,JFrame Meteors类只需排队即可。

很多问题。

  1. 使用paintComponent()方法是绘制到JPanel的唯一方法吗?我的旧类的工作方式是使用一个常量while循环(针对帧速率进行管理)来连续调用完成所有工作的update()和draw()方法。因此,该方法每秒将自己绘制到JFrame上40次。

    随着我的更新将draw()转换为paintComponent(),框架只绘制一次,然后消失。我需要找到一种方法来不断地重新绘制JPanel。(为了消除闪烁,我通过写入图像然后绘制图像来绘制面板)

  2. 有更好的方法来做这一切吗?我是从Objective-C iOS开发的背景开始的,在那里我对视图层次结构更加熟悉。我确信我所做的无论如何都不是最理想的情况。

此外,当我在JFrame类中创建一个JButton并尝试使用以下代码绘制它时,不会发生任何事情。我做错了什么?

JButton button = new JButton("Close");
button.setLocation(300, 300);
add(button);

"使用paintComponent()方法是绘制到JPanel的唯一方法吗?"

严格来说,没有。但这是正确的方式。

"我的旧类的工作方式是使用一个常量while循环(针对帧速率管理)来连续调用完成所有工作的update()和draw()方法"

不要这样做。相反,实现javax.swing.Timer将延迟传递给定时器,定时器将确定帧速率。查看更多关于如何使用摆动定时器

"随着我的更新将draw()转换为paintComponent(),框架只绘制一次,然后消失。"

您想要做的是有一个模型类,比如Asteroid,它维护每个Asteroid对象的状态。然后,您可以维护一个List<Asteroid>,可以在Timer中对其进行迭代,调用其每个方法来操纵其状态,然后用计时器的每一次滴答声重新绘制()面板。然后,您可以在paintComponent方法中迭代List,并调用每个Asteroiddraw方法。

"我需要找到一种方法来不断地重新绘制JPanel。(为了消除闪烁,我通过写入图像然后绘制图像来绘制面板)"

在大多数情况下,使用Timer(如果使用正确)将有助于缓解闪烁(当然,考虑到我可能不知道的其他因素)。

"有更好的方法来完成这一切吗?"

考虑到以上所有注意事项,看看这个答案,它考虑到了所有这些点,也是一个想成为小行星的游戏/游戏背景。

"此外,当我在JFrame类中创建一个JButton并尝试使用以下代码绘制它时,什么都没有发生。我做错了什么?"

无法用您提供的代码来判断。

相关内容

  • 没有找到相关文章

最新更新