Подтвердить что ты не робот

Разница между краской, paintComponent и paintComponents в Swing

Какова фактическая разница между paint(), paintComponent() и paintComponents() в Java Swing?

Я попытался понять, что объясняется в документах Oracle, но я не понимаю.

4b9b3361

Ответ 1

  • AWT, переопределить paint().
  • Верхний контейнер качания (например, JApplet, JFrame, JWindow, JDialog..), переопределяет paint(). Но есть ряд веских причин не рисовать в TLC. Возможно, тема для отдельного вопроса.
  • Остальная часть Swing, переопределяет paintComponent().
  • Ни переопределить, ни явно называть paintComponents(), оставьте его API, чтобы вызвать его при необходимости.

Обязательно также используйте нотацию @Override при переопределении метода.

Сделав это, мы попытались бы переопределить paintComponent(..) в JFrame (он не имеет такого метода), что довольно часто встречается.

Ответ 2

Вам может быть интересно прочитать Живопись в AWT и Swing

Цитата:

Правила, применимые к легким компонентам AWT, также применяются к компонентам Swing - например, paint() вызывается, когда время для рендеринга - за исключением того, что Swing дополнительно влияет на вызов paint() на три отдельных метода, которые вызывается в следующем порядке:

 protected void paintComponent(Graphics g)
protected void paintBorder(Graphics g)
protected void paintChildren(Graphics g)

Программы Swing должны переопределять paintComponent() вместо переопределения paint(). Хотя API позволяет это, обычно нет причин переопределять paintBorder() или paintComponents() (и если да, убедитесь, что вы знаете, что делаете!). Этот факторинг упрощает для программ отмену только той части картины, которую они должны продлить. Например, это решает проблему AWT, упомянутую ранее, когда отказ вызвать super.paint() помешал появлению каких-либо легких детей.