【问题标题】:Is it appropriate to extend JPanel to create a drawing surface for a 2D game?扩展 JPanel 是否适合为 2D 游戏创建绘图表面?
【发布时间】:2012-03-15 08:21:12
【问题描述】:

我正在将 2D 游戏从 Applet 转换为 JFrame。我知道我应该将 JPanel 添加到 JFrame 并使用 JPanel 作为我的绘图表面,但我不确定我应该将什么子类化。我正在使用 JFrame 进行尝试,但我读到扩展 JFrame 通常是不必要的,也是一个坏主意(无论如何我没有添加任何额外的功能,所以这是有道理的)。我需要覆盖 JPanel 的 paintComponent() 方法,所以现在我倾向于扩展 JPanel。有没有更好的方法来创建 2D 游戏界面,或者扩展 JPanel 并将其添加到 JFrame 是一种合适的方法?

【问题讨论】:

  • 你是对的——使用 JPanel 或 JComponent 并覆盖paintComponent。查看将背景绘制到 BufferedImage 中,您将在调用 super 方法后立即在 paintComponent 方法中绘制它。 Sprite 可能会直接在 BufferedImage 上方的 paintComponent 方法中绘制。也为@Snicolas 的出色录音加分。

标签: java swing user-interface


【解决方案1】:

不,没有更好的方法,这是一个非常好的选择。 如果您要扩展 JFrame(另一个选项),您的动画将在大多数 Windows 系列操作系统上闪烁。

JPanel 是一个纯摇摆组件,在 java 中的反应比 JFrame 等对等组件更好。

你的选择不错,继续愉快地编程吧。

【讨论】:

  • 哦,如果是为了游戏,别忘了重写isFocusable方法,让它返回true,这样你就可以捕捉按键了。
  • 感谢您的帮助。这不仅会更好地工作,而且还解决了我之前遇到的恼人问题,我的 JPanel 会在标题栏下方绘制。
  • 回到 Java-gaming.org,我们有一个成员坚持认为 JComponent 比 JPanel 更正确。如果我没记错的话,他的推理是 JPanel(JComponent 的一个子类)添加了未使用的功能,例如,添加更多 Java 组件的能力,而游戏通常不需要这些功能。我认为使用哪一个(在 JComponent 和 JPanel 之间)并不重要。
【解决方案2】:

更新

自从我最初回答这个问题以来,我在这方面的知识有所增长,我同意 @Snicolas 的观点,即您应该使用 JPanel。

JPanel(因为它是一个摆动组件)内置了对双缓冲的支持(AWT 没有)并且性能更好(所以我听说了,但我没有这方面的第一手经验)。

您可能会发现这篇文章很有用:http://www.oracle.com/technetwork/java/painting-140037.html#swing

原答案:

我建议您继承 Canvas 或 Component 或 JComponent。我的首选是帆布。你应该阅读2d graphics tutorial

更新

使用 Canvas 是因为它接收所有用户输入事件并且没有作为容器的包袱。 read more。例如,面板不会接收所有鼠标输入事件。

【讨论】:

  • 请说明您偏爱 Canvas 的原因。为什么在 JComponent 或 JPanel 上使用它?为什么要求 OP 为双缓冲创建自己的后台缓冲区,而不是让 Swing 组件自动为您做这件事?
猜你喜欢
  • 2012-06-13
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
相关资源
最近更新 更多