super.paintComponent(g)做什么?

super.paintComponent(g)做了什么(特别是当我们将它放在paintComponent()方法中时)? 我很惊讶我以前没有看到有人问这个问题。

我在Java Graphics上挖掘了我的学校笔记,它在这行代码中唯一提到的是"do not delete"

但是这几周我一直在练习和使用Java paintComponent()方法。 到目前为止,我没有将该行包含在我的代码中,并且一切似乎都运行良好(到目前为止)。 所以..

问题:

  1. 它有什么作用?
  2. 我们什么时候需要使用它?
  3. 它通过在paintComponent()中编写它给我们带来了什么好处?

  1. 它有什么作用?

它会打印组件,就好像您没有覆盖paintComponent方法一样。 例如,如果您有背景颜色集,则通常由您要扩展的类绘制。

  1. 我们什么时候需要使用它?

如果不在整个组件上绘画,则使用它。 你没有画的部分会“透过”,这意味着你应该让超级画这些部分。 与背景颜色的示例一样:例如:如果您只是在组件的中间绘制一个圆, super.paintComponent将确保在圆周周围绘制背景颜色。

如果你绘制组件的整个区域,那么你将在任何super.paintComponent绘制之上绘制,因此调用super.paintComponent没有意义。

  1. 它通过在paintComponent()中编写它给我们带来了什么好处?

这是唯一合乎逻辑的地方。 应该在绘制组件时调用paintComponent ,并且如上所述,如果您不自己绘制整个组件,则需要使用super.paintComponent在透过的部件上绘制。

paintComponent 的文档说得很好:

[…]如果你没有调用super的实现,你必须遵守opaque属性,即如果这个组件是不透明的,你必须用非透明颜色完全填充背景。 如果您不遵守opaque属性,您可能会看到视觉伪像。

来自Java绘画教程 :

大多数标准Swing组件的外观都由单独的“UI Delegate”对象实现。 super.paintComponent(g)的调用将图形上下文传递给组件的UI委托,该委托绘制了面板的背景。 有关此过程的详细信息,请参阅上述SDN文章中标题为“绘画和UI代理”的部分。