super.paintComponent(g)
做什么(尤其是当我们将其放置在paintComponent()方法中时)?我很惊讶以前在SO中没有看到有人问这个问题。
我翻出了我在Java Graphics上的学校笔记,这行代码中唯一提到的是"do not delete"
。
然而,这几周我一直在练习Java paintComponent()方法。到目前为止,我还没有将这一行包含在我的代码中,而且一切似乎都很好(到目前为止)。所以…
问题:
- 它做什么
- 我们什么时候需要使用它
- 用paintComponent()编写它给我们带来了什么好处
- 它做什么
它打印组件,就好像您没有重写paintComponent
方法一样。例如,如果你有一个背景颜色集,它通常是由你扩展的类绘制的。
- 我们什么时候需要使用它
如果不在整个零部件上绘制,则可以使用它。你没有画的部分会"发光",这意味着你应该让超级类画那些部分。例如,与背景颜色的示例一样:如果您只是在组件的中间绘制一个圆,super.paintComponent
将确保背景颜色围绕该圆绘制。
如果绘制组件的整个区域,那么您将在super.paintComponent绘制的任何区域上进行绘制,因此调用super.paintComponent.没有意义
- 用paintComponent()编写它给我们带来了什么好处
这是唯一合乎逻辑的地方。paintComponent
在应该绘制组件时被调用,如上所述,如果你自己不绘制整个组件,你需要super.paintComponent
在发光的部分上绘制。
paintComponent
的文档很好地说明了这一点:
[…]如果你不调用super的实现,你必须遵守opaque属性,也就是说,如果这个组件是不透明的,你必须用非不透明的颜色完全填充背景。如果您不尊重不透明属性,您可能会看到视觉伪影。
来自Java绘画教程:
大多数标准Swing组件的外观都是由单独的"UIDelegate"对象实现的。super.paintComponent(g)的调用将图形上下文传递给组件的UI代理,UI代理绘制面板的背景。有关此过程的详细信息,请参阅前面提到的SDN文章中题为"绘画和UI代理"的部分。