我有一个问题无法理解,也无法解决。
我正在制作一个小行星的复制品(为了聪明起见,我称之为流星)。目前我有一个名为MeteorGame
的类,它是绘制GUI的主要类。MeteorGame扩展了JFrame以创建窗口,并且它还有另一个用于解释键盘事件的类。一切都很好,但我需要扩大规模。基本上,我所创造的只是游戏的一个"关卡",现在我需要一个关卡管理员。我将这个类称为Meteors
,我希望IT处理创建JFrame,而不是MeteorGame。
因此,我试图创建一个系统,在这个系统中,Meteors类基本上是一个外壳,它创建了一个窗口,并按顺序实例化MeteorGame的"级别"。我已经将MeteorGame类从JFrame转换为JPanel,这样我的JFrame Meteors类就可以在用户升级时将JPanel组件添加到自己中。
我希望每个MeteorGame都能完全自主地绘制自己并解释键盘事件,JFrame Meteors类只需排队即可。
很多问题。
-
使用paintComponent()方法是绘制到JPanel的唯一方法吗?我的旧类的工作方式是使用一个常量
while
循环(针对帧速率进行管理)来连续调用完成所有工作的update()和draw()方法。因此,该方法每秒将自己绘制到JFrame上40次。随着我的更新将draw()转换为paintComponent(),框架只绘制一次,然后消失。我需要找到一种方法来不断地重新绘制JPanel。(为了消除闪烁,我通过写入图像然后绘制图像来绘制面板)
-
有更好的方法来做这一切吗?我是从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,并调用每个Asteroid
的draw
方法。
"我需要找到一种方法来不断地重新绘制JPanel。(为了消除闪烁,我通过写入图像然后绘制图像来绘制面板)"
在大多数情况下,使用Timer
(如果使用正确)将有助于缓解闪烁(当然,考虑到我可能不知道的其他因素)。
"有更好的方法来完成这一切吗?"
考虑到以上所有注意事项,看看这个答案,它考虑到了所有这些点,也是一个想成为小行星的游戏/游戏背景。
"此外,当我在JFrame类中创建一个JButton并尝试使用以下代码绘制它时,什么都没有发生。我做错了什么?"
无法用您提供的代码来判断。