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

时间:2014-04-21 02:28:10

标签: java swing user-interface game-engine

我遇到了一个我无法理解的问题,但也没有解决。

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

所以为此,我想要创建的是一个系统,其中Meteors类基本上是一个shell,它创建一个窗口并实例化" levels"流星游戏的顺序。我已将我的MeteorGame类从JFrame转换为JPanel,以便我的JFrame Meteors类在用户升级时将JPanel组件添加到自身。

我希望每个MeteorGame都能自己绘制并完全自主地解释键盘事件,而JFrame Meteors类只是简单地排队等级。

很多问题。

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

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

  2. 有没有更好的方法来完成所有这些?我从Objective-C iOS开发的后台开始,我更熟悉视图层次结构。我确信我所做的并不是最理想的情况。

  3. 此外,当我在JFrame类中创建JButton并尝试使用以下代码绘制它时,没有任何反应。我做错了什么?

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

1 个答案:

答案 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并尝试使用以下代码绘制它时,没有任何反应。我做错了什么?”

无法判断您提供的代码。