Разница между paint, paintComponent и paintComponents в Swing

В чем реальная разница между paint(), paintComponent() и paintComponents() в Java Swing?

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


person Abhishek Choudhary    schedule 22.02.2012    source источник


Ответы (2)


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

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

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

person Andrew Thompson    schedule 22.02.2012
comment
Привет, функция paint() вызывается сразу после завершения конструктора? - person Sam YC; 27.11.2012
comment
@GMsoF repaint() будет вызываться автоматически при необходимости. При анимации это также может быть вызвано явно. Хотя звонили слишком много раз, слишком быстро, и некоторые звонки будут объединены (проигнорированы). - person Andrew Thompson; 27.11.2012
comment
также переопределите paint(), если вы хотите нарисовать что-то в своем подклассе jpanel, который находится ВЫШЕ компонентов на той же панели - например, если GPanel является вашим подклассом JPanel, переопределяя только paintComponent, ваши рисунки будут расположены за любыми компонентами, такими как как кнопки, другие панели и т. д. Однако, используя paint(), вы рисуете поверх других компонентов. - person PixelMaster; 15.03.2016

Вам может быть интересно прочитать Рисование в 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() препятствовал появлению любых облегченных дочерних элементов.

person Avrom    schedule 22.02.2012