super.paintComponent(g) 有啥作用?
Posted
技术标签:
【中文标题】super.paintComponent(g) 有啥作用?【英文标题】:What does super.paintComponent(g) do?super.paintComponent(g) 有什么作用? 【发布时间】:2015-04-27 18:38:34 【问题描述】:super.paintComponent(g)
做了什么(尤其是当我们将它放在 paintComponent() 方法中时)?我很惊讶以前没有人在 SO 中问过这个问题。
我在Java Graphics上翻出我的学校笔记,这行代码中唯一提到的就是"do not delete"
。
然而,这几周我一直在练习和使用 Java paintComponent() 方法。到目前为止,我还没有将该行包含在我的代码中,并且一切似乎都运行良好(到目前为止)。所以..
问题:
-
它有什么作用?
我们什么时候需要使用它?
把它写在paintComponent()中给我们带来了什么好处?
【问题讨论】:
.." 一切似乎都运行良好" - 尝试在不调用 animation 的情况下执行一些操作,看看会发生什么。结果应该让您很好地理解为什么我们应该调用它。见result of not calling it @peeskillet 我刚刚在***.com/questions/22123266/… 中对您的解决方案投了赞成票。这是一个很好的解决方案。 【参考方案1】:它有什么作用?
它会打印组件,就好像您没有覆盖 paintComponent
方法一样。例如,如果您设置了背景颜色,则通常由您扩展的类绘制。
我们什么时候需要使用它?
如果您不在整个组件上绘制,则使用它。您不绘制的部分会“发光”,这意味着您应该让超类绘制这些部分。以背景颜色为例:如果您只是在组件中间画一个圆圈,super.paintComponent
将确保背景颜色是围绕圆圈绘制的。
如果您确实绘制了组件的整个区域,那么您将在 super.paintComponent 绘制的任何内容之上进行绘制,因此调用 super.paintComponent 毫无意义。
把它写在paintComponent()中给我们带来了什么好处?
这是唯一合乎逻辑的地方。 paintComponent
在组件应该被绘制的时候被调用,并且如上所述,如果你不自己绘制整个组件,你需要super.paintComponent
来绘制发光的部分。
paintComponent
的The documentation 说得很好:
[...] 如果你没有调用 super 的实现,你必须遵守 opaque 属性,也就是说,如果这个组件是不透明的,你必须用非透明的颜色完全填充背景。如果您不尊重 opaque 属性,您可能会看到视觉伪影。
【讨论】:
感谢您的回复。看起来我应该总是尝试包含那行代码。但是,有没有什么情况我不应该把那行代码放到paintComponent()
中?
是的。如果您在整个组件上进行绘制(例如,您绘制了一些覆盖整个组件的彩虹背景),那么首先执行 super.paintComponent 是完全没有意义的。
@aiobee 我明白了,非常感谢您简洁而准确的回复。【参考方案2】:
来自Java Painting Tutorial:
大多数标准 Swing 组件的外观和感觉都是由单独的“UI Delegate”对象实现的。 super.paintComponent(g) 的调用将图形上下文传递给组件的 UI 委托,该委托绘制面板的背景。要详细了解此过程,请参阅上述 SDN 文章中标题为“绘画和 UI 委托”的部分。
【讨论】:
以上是关于super.paintComponent(g) 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章