super.paintComponent(g) 是做什么的?

What does super.paintComponent(g) do?

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

我在Java图形上翻出了我的学校笔记,它在这行代码中唯一提到的是"do not delete"

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

问题:

  1. 它有什么作用?
  2. 我们什么时候需要使用它?
  3. 写在paintComponent()里面给我们带来什么好处?
  1. What does it do?

它打印组件,就像您没有覆盖 paintComponent 方法一样。例如,如果您设置了背景颜色,这通常由您正在扩展的 class 绘制。

  1. When do we need to use it?

如果不在整个组件上绘制,则可以使用它。您不绘制的部分将 "shine through" 这意味着您应该让超级 class 绘制这些部分。以背景颜色为例:如果您只是在组件中间绘制一个圆圈,super.paintComponent 将确保在圆圈周围绘制背景颜色。

如果您 绘制组件的整个区域,那么您将绘制在任何 super.paintComponent 绘制的顶部,因此调用 super.paintComponent.

  1. What advantage does it gives us by writing it in paintComponent()?

这是唯一合乎逻辑的地方。 paintComponent在组件应该被绘制的时候被调用,并且,如前所述,如果您不自己绘制整个组件,则需要super.paintComponent在发光的部分进行绘制。

The documentation of paintComponent 说得很好:

[...] if you do not invoker super's implementation you must honor the opaque property, that is if this component is opaque, you must completely fill in the background in a non-opaque color. If you do not honor the opaque property you will likely see visual artifacts.

来自Java Painting Tutorial

Most of the standard Swing components have their look and feel implemented by separate "UI Delegate" objects. The invocation of super.paintComponent(g) passes the graphics context off to the component's UI delegate, which paints the panel's background. For a closer look at this process, see the section entitled "Painting and the UI Delegate" in the aforementioned SDN article.