我遇到了一个我无法理解的问题,但也没有解决。
我正在制作小行星的克隆(我称之为Meteors,要聪明)。目前我有一个名为MeteorGame
的类,它是执行GUI绘图的主要类。 MeteorGame扩展了JFrame以创建窗口,它还有另一个用于解释键盘事件的类。一切都很好,但我需要扩大规模。基本上,我创造的是一个"等级"游戏,现在我需要一名关卡经理。我称这个类Meteors
,我希望IT处理创建JFrame,而不是MeteorGame。
所以为此,我想要创建的是一个系统,其中Meteors类基本上是一个shell,它创建一个窗口并实例化" levels"流星游戏的顺序。我已将我的MeteorGame类从JFrame转换为JPanel,以便我的JFrame Meteors类在用户升级时将JPanel组件添加到自身。
我希望每个MeteorGame都能自己绘制并完全自主地解释键盘事件,而JFrame Meteors类只是简单地排队等级。
很多问题。
使用paintComponent()方法绘制到JPanel的唯一方法是什么?我的旧类的工作方式是它使用一个常量while
循环(管理帧速率)来连续调用执行所有工作的update()和draw()方法。因此,每秒40次该方法将自己绘制到JFrame上。
我的更新将draw()转换为paintComponent(),框架只绘制一次,然后消失。我需要找到一种方法来不断重绘JPanel。 (消除闪烁我通过写入图像然后绘制图像来绘制面板)
有没有更好的方法来完成所有这些?我从Objective-C iOS开发的后台开始,我更熟悉视图层次结构。我确信我所做的并不是最理想的情况。
此外,当我在JFrame类中创建JButton并尝试使用以下代码绘制它时,没有任何反应。我做错了什么?
JButton button = new JButton("Close");
button.setLocation(300, 300);
add(button);
答案 0 :(得分:2)
“使用paintComponent()方法绘制到JPanel的唯一方法是什么?”
从技术上讲,没有。但这是正确的方法。
“我的旧类的工作方式是它使用一个常量while循环(以帧速率管理)来连续调用update()和draw()方法完成所有工作”
不要这样做。而是将javax.swing.Timer
传递延迟实现到计时器,这将确定帧速率。请点击How to Use Swing Timers
“我的更新将draw()转换为paintComponent(),框架只绘制一次,然后消失。”
你想要做的是拥有一个模型类,比如Asteroid
,它维护每个Asteroid
对象的状态。然后,您可以维护List<Asteroid>
,您可以在Timer
中调用其每个方法来调用其状态,然后在计时器的每个滴答处重新绘制()面板。然后,您可以使用paintComponent
方法遍历列表,并调用每个Asteroid
的{{1}}方法。
“我需要找到一种方法来不断重绘JPanel。(消除闪烁我通过写入图像然后绘制图像来绘制面板)”
在大多数情况下,使用draw
(如果使用正确)将有助于缓解闪烁(当然,考虑到我可能不知道的其他因素)。
“有没有更好的方法来完成所有这些?”
考虑上述所有注意事项并查看this answer,其中考虑了所有这些点,并且也是游戏/游戏背景中的小行星。
“另外,当我在JFrame类中创建JButton并尝试使用以下代码绘制它时,没有任何反应。我做错了什么?”
无法判断您提供的代码。