2015-04-20 3 views
1

Какова важность вызова метода paintComponent, который определяет суперкласс при переопределении его в подклассе. Я не мог понять причину. Например: см. Приведенный ниже код для отображения заполненных дуг:Является вызовом super.paintComponent() важно?

package graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

import java.awt.Color; 
import java.awt.Graphics; 

@SuppressWarnings("serial") 
class DrawArcs2 extends JFrame { 

    public DrawArcs2() { 
     setTitle("The Four Fan Blades"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     add(new BladesPanel()); 
    } 

    class BladesPanel extends JPanel { 
     protected void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setColor(Color.MAGENTA); 

      int xCenter = getWidth()/2; 
      int yCenter = getHeight()/2; 
      int radius = (int)(Math.min(getWidth(), getHeight()) * 0.4); 

      int x = xCenter - radius; 
      int y = yCenter - radius; 

      g.fillArc(x, y, 2 * radius, 2 * radius, 0, 30); 
      g.fillArc(x, y, 2 * radius, 2 * radius, 90, 30); 
      g.fillArc(x, y, 2 * radius, 2 * radius, 180, 30); 
      g.fillArc(x, y, 2 * radius, 2 * radius, 270, 30); 
     } 
    } 

    public static void main(String[] args) { 
     DrawArcs2 fanBlades = new DrawArcs2(); 
     fanBlades.setSize(300,300); 
     fanBlades.setVisible(true); 
    } 
} 

ответ

2

Короткий ответ: да, это важно.

Одна из заданий paintComponent заключается в подготовке контекста для рисования Graphics, как правило, это делается путем заполнения контекста Graphics цветом фона текущего компонента.

Но, что еще более важно, это один из методов, который образует цепочку лакокрасочных методов, которые вместе создают результат окраски, и вы должны продолжать поддерживать, что ссылка на код paintComponent изменяется в будущем или компонент, ве простирающийся от делает другую работу с ним (как JTable, например)

в противном случае назвать это может привести к любому количеству Graphics глюков и артефактов, которые трудно отследить и даже производить надежно

Посмотрите на Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации о процессе окраски

+0

спасибо! Хорошо понял сейчас! –

+0

Рад, что это может помочь – MadProgrammer

1

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

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