Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Выполнение Пользовательского Рисования
Более близкий Взгляд на Механизм Краски
Домашняя страница > Создание GUI С JFC/Swing > Выполнение Пользовательского Рисования

Более близкий Взгляд на Механизм Краски

К настоящему времени Вы знаете что paintComponent метод - то, куда весь Ваш код рисования должен быть помещен. Это - истина, что этот метод будет вызван, когда будет пора нарисовать, но красящий фактически начинает выше class heirarchy, с paint метод (определенный java.awt.Component.) Этот метод будет выполняться подсистемой рисования всякий раз, когда Вы компонент должны быть представлены. Его подпись:

javax.swing.JComponent расширяет этот class и дальнейшие факторы paint метод в три отдельных метода, которые вызываются в следующем порядке:

API не делает ничего, чтобы препятствовать тому, чтобы Ваш код переопределил paintBorder и paintChildren, но вообще говоря, нет никакой причины для Вас сделать так. Для всех практических целей paintComponent будет единственный метод, который Вы должны будете когда-либо переопределять.

Как ранее упомянуто, большинству стандартных компонентов Swing реализовывали их стиль отдельные Делегаты UI. Это означает, что большинство (или все) рисования для стандартных компонентов Swing продолжается следующим образом.

  1. paint() вызывает paintComponent().
  2. Если ui свойство является ненулем, paintComponent() вызывает ui.update().
  3. Если компонент opaque свойство является истиной, ui.update() заполняет фон компонента цветом фона и вызывает ui.paint().
  4. ui.paint() представляет контент компонента.

Это то, почему наш SwingPaintDemo код вызывает super.paintComponent(g). Мы могли добавить дополнительный комментарий, чтобы сделать это больше четкий:

public void paintComponent(Graphics g) {
    // Let UI Delegate paint first, which 
    // includes background filling since 
    // this component is opaque.

    super.paintComponent(g);       
    g.drawString("This is my custom Panel!",10,20);
    redSquare.paintSquare(g);
}  

Если Вы поняли весь демонстрационный код, обеспеченный в этом уроке, поздравлениях! У Вас есть достаточно многие практические знания, чтобы записать эффективный код рисования в Ваших собственных приложениях. Если однако Вы хотите более близкий взгляд "под капотом", пожалуйста, обратитесь к статье SDN, соединенной с от первой страницы этого урока.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Совершенствование Проекта
Следующая страница: Сводка