Почему метод paintComponent выполняется автоматически?

Рейтинг: 2Ответов: 2Опубликовано: 07.11.2014

Здравствуйте. Только начал изучать Java. Не пойму, как работает метод paintComponent из программы:

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

import javax.swing.JFrame;
import javax.swing.JPanel;

public class prog3 {

    public static void main(String[] args) {

    myFrame okno = new myFrame();

    }   
}

class myFrame extends JFrame
{
    myFrame()
    {
        myPanel pn = new myPanel();
        Container cont = getContentPane();
        cont.add(pn);
        setBounds(10, 10, 300, 600); 
        setVisible(true);   
    }

}

    class myPanel extends JPanel
    {
        public void paintComponent(Graphics gr)
        {
            gr.setColor(Color.BLUE);
            gr.drawRect(10, 10, 200, 300);
        }
    }

Метод не является конструкторам, тем не менее запускается автоматически при создании объекта - pn

Ответы

▲ 3

Данный метод находится в классе JComponent, откуда и вызывается при прорисовке компонента. JComponent это предок класса JPanel, от которого вы отнаследовались. В вашем случае вы его переопределили (Override), но ваш класс так и остался наследником JComponent, соответственно теперь вызывается ваш метод, а не тот, внутренний. Советую в таких случаях смотреть исходный код классов, от которых наследуетесь, помогает разобраться во многом.

**UPD**

public JPanel(LayoutManager layout, boolean isDoubleBuffered) {
    setLayout(layout);
    setDoubleBuffered(isDoubleBuffered);
    setUIProperty("opaque", Boolean.TRUE);
    updateUI();
}

public JPanel(LayoutManager layout) {
    this(layout, true);
}

public JPanel(boolean isDoubleBuffered) {
    this(new FlowLayout(), isDoubleBuffered);
}

public JPanel() {
    this(true);
}

Это конструкторы JPanel. Поскольку ваш myPanel - наследник JPanel, то при вызове конструктора myPanel

myPanel pn = new myPanel();

у вас неявно вызывается конструктор JPanel, тот который без параметров. Если посмотреть на цепочку, которая будет пройдена по конструкторам JPanel, в самом верхнем есть метод updateUI(), предполагаю что там внутри где-то дергается paintComponent, но вы это вряд ли найдете, так как там много рефлексии, думаю этот вызов прячется где-то там.

**UPDUPD**

http://www.oracle.com/technetwork/java/painting-140037.html

Вот здесь написано обо всех махинациях.

▲ 3

Учебник Head First Java, Kathy Sierra, Bert Bates. стр. 394

Цитирую:

В любое время, когда JVM посчитает, что экран нужно обновить, будет вызван ваш метод paintComponent(). Считайте, что этот метод вызывается системой.