【问题标题】:Swing rendering... does it always have to be repaint() and paintComponent()?Swing 渲染……它总是必须是 repaint() 和 paintComponent() 吗?
【发布时间】:2014-09-23 00:22:57
【问题描述】:

在我的程序中,我将 Swing 窗口用于我的 GUI,并且我知道我应该使用 repaint 和 paintComponent 方法来呈现 Swing 组件。我还有几个需要在主窗口中呈现的自定义类对象。为了便于理解,我的程序是一个游戏,其中包含需要每秒渲染 60 次的移动对象。

在我看过的一个游戏开发教程中,这家伙使用了带有 Canvas 的 Jframe,但他没有使用 paintComponent 方法。他只是创建了自己的 render() 方法,使用从创建 bufferStrategy 获得的图形上下文绘制所有图形。

那么,如果这行得通(确实如此),为什么每个人都说要使用 paintComponent 方法,它们之间到底有什么区别?

如果我要使用paintComponent 的处理方式,我将如何使用bufferStrategy?

【问题讨论】:

  • 是的,我对 Swing 比对 AWT 更熟悉。 Canvas 到底是做什么用的?
  • 您的意思是来自 Canvas?那么 Canavs 会扩展 JPanel 吗?
  • 忽略我,听听@MadProgrammer..

标签: java swing paintcomponent


【解决方案1】:

在我看过的一个游戏开发教程中,这家伙使用了带有 Canvas 的 Jframe,但他没有使用 paintComponent 方法。他只是创建了自己的 render() 方法,使用从创建 bufferStrategy 获得的图形上下文绘制所有图形。

Canvas 是一个 AWT 组件,使用 BufferStrategy,您将接管绘画过程并负责更新 Graphics 上下文并安排将其推送到硬件/屏幕。

这通常称为“主动绘画”,因为您会不断(假设以恒定帧速率)更新缓冲区。

Swing 使用被动绘制过程,因此您永远不知道绘制过程何时会发生。 Swing 有自己的机制来确定应该重绘什么以及何时重绘。使用repaint,您向这些机制发出重新绘制组件的请求,但无法保证会因此启动绘制周期。

如果您使用任何 Swing 组件进行绘画,则必须使用 repaintpaintComponent,因为 Swing 负责提供您可以绘画的上下文。

如果你想使用Canvas,那么你可以使用BufferStrategy

本质上,它们是不同的绘画方法。但请记住,如果您使用BufferStrategy,您将丢失所有的 Swing API,您不能通过这种方法使用 Swing 组件,因为它们并非设计为以这种方式工作...

【讨论】:

  • Hmm... 是否有与摇摆兼容的 BufferStrategy 的良好替代品?我真的很喜欢 Swing 组件,但我需要不断地绘制图像,这可能会减慢我的图形速度。
  • @zephos2014 不,但除非你有一个在 Swing 中无法解决的绝对问题,否则可能还没有必要担心......
  • 您是在推断不需要 BufferStrategy 吗?我不知道摇摆是如何决定画东西的,所以我不知道。我认为最好使用 BufferStrategy 的原因是因为我会有动画。 Swing 处理动画效果好吗?
  • @zephos2014 你必须记住,Swing 是一个 UI 框架,建立在 AWT 之上,旨在解决 AWT 的问题(定制就是其中之一)。它是为某种目的而设计的。如果您可以在该框架内工作以实现您想要的,那么很好,如果您不能,那么您需要研究其他解决方案...Swing 为您提供了一些不错的组件来与用户交互
  • 另外,我发现这句话说swing和awt现在更兼容了:java.dzone.com/news/a-farewell-heavyweightlightwei
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2012-09-28
  • 2017-01-15
  • 1970-01-01
  • 2017-01-03
  • 2021-04-25
  • 2019-03-29
相关资源
最近更新 更多