Что делает super.paintComponent(g)?

Что делает super.paintComponent(g) (особенно когда мы помещаем его внутрь метода paintComponent())? Я удивлен, что я не вижу, чтобы кто-нибудь спрашивал об этом раньше.

Я выкапываю свои школьные заметки на Java Graphics, единственное, что упоминалось в этой строке кода, - "do not delete".

Однако я несколько раз практиковал и привязывал метод Java paintComponent(). Пока я не включил эту строку в свои коды, и все, кажется, работает хорошо (до сих пор). Так..

Вопросы:

  • Что он делает?
  • Когда нам нужно его использовать?
  • Какое преимущество дает нам, написав его в paintComponent()?

Ответы

Ответ 1

  • Что он делает?

Он печатает компонент так, как будто вы не переопределили метод paintComponent. Если у вас есть цвет фона, например, это обычно окрашивается классом, который вы расширяете.

  1. Когда нам нужно его использовать?

Вы используете его, если не рисуете весь компонент. Части, которые вы не рисуете, будут "сиять", что означает, что вы должны позволить суперклассическому рисовать эти части. Например, например, на примере цвета фона: Если вы просто рисуете круг в середине компонента, super.paintComponent будет следить за тем, чтобы цвет фона был нарисован вокруг круга.

Если вы нарисуете всю область своего компонента, тогда вы нарисуете поверх того, что красит super.paintComponent, и, таким образом, нет смысла в вызове super.paintComponent.

  1. Какое преимущество дает нам, написав его в paintComponent()?

Это единственное логическое место. paintComponent вызывается, когда компонент должен быть окрашен, и, как упоминалось выше, если вы не рисуете весь компонент самостоятельно, вам нужно super.paintComponent рисовать на деталях, которые светятся.

Документация paintComponent говорит об этом довольно хорошо:

[...], если вы не выполняете суперверсию invoker, вы должны соблюдать непрозрачное свойство, то есть, если этот компонент непрозрачен, вы должны полностью заполнить фон непрозрачным цветом. Если вы не соблюдаете непрозрачную собственность, вы, скорее всего, увидите визуальные артефакты.

Ответ 2

Из Учебник по рисованию Java:

Большинство стандартных компонентов Swing имеют внешний вид, реализованный отдельными объектами "UI Delegate". Вызов super.paintComponent(g) передает графический контекст делегату компонента компонента, который рисует фон панели. Более подробно этот процесс см. В разделе "Живопись и делегат пользовательского интерфейса" в вышеупомянутой статье SDN.