2015-02-25 2 views
15

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

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

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

Вопросы:

  1. Что это делает?
  2. Когда нам нужно его использовать?
  3. Что это дает нам, написав его в paintComponent()?
+0

_ .. "и все, кажется, хорошо работает" _ - Попробуйте сделать [анимацию] (http://stackoverflow.com/a/22123304/2587435), не называя ее и не узнайте, что произойдет. Результат должен дать вам хорошее представление о том, почему мы должны это назвать. См. [Результат не называть его] (http://stackoverflow.com/q/26477521/2587435) –

+0

Почему голос? – user3437460

+0

Не было меня ...... –

ответ

14
  1. Что это делает?

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

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

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

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

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

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

The documentation из paintComponent говорит, что это очень хорошо:

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

+0

Спасибо за ваш ответ. Похоже, я всегда стараюсь включить эту строку кода. Однако есть ли ситуация, когда я не должен помещать эту строку кода в 'paintComponent()'? – user3437460

+0

Да. Если вы рисуете весь свой компонент (скажем, вы рисуете некоторый фон радуги, который охватывает весь компонент, например), тогда совершенно бессмысленно сначала делать super.paintComponent. – aioobe

+0

@aiobee Я вижу, большое спасибо за ваш краткий и точный ответ. – user3437460

3

От Java Painting Tutorial:

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

Смежные вопросы