Prosiłbym o pomoc w wytłumaczeniu, dlaczego to tak a nie inaczej działa. Zrobiłem sobie taki test:
package pl.test.dodge;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;
public class Dodge extends JPanel {
public Dodge(){
System.out.println("konstruktor Dodge()");
setSize(new Dimension(500,400));
setPreferredSize(new Dimension(500,400));
setBackground(Color.black);
}
public void paint(Graphics g){
//ta metoda jest caly czas wywolywana, nie musze jej wywolac
System.out.println("metoda paint()");
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
System.out.println("opuszczam paint()");
}
public static void main(String[] args){
System.out.println("tworze obiekt dodge w mainie");
Dodge game = new Dodge();
System.out.println("ciag dalszy maina");
JFrame frame = new JFrame();
frame.setTitle("Dodge the Rectangle");
frame.add(game); ///JAK TO ZAKOMENTUJE TO METODA PAINT NIE JEST WYWOLYWANA!
frame.pack();
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
1. Domyśliłem się, że metoda paint() jest automatycznie wywoływana przez jave w momencie, jak zaczynam rysować czyli korzystać z klasy JFrame? Ktoś może to rozwinąć? W tym moim przykładzie przeciążam tę metodę na podobnej zasadziej, jak przeciążamy (zalecane jest to) metodę toString() ?
2. Gdy zakomentuję frame.add(game) metoda paint() nie jest wywoływana - to dodanie "komponentu" (?) czy obiektu do ramki JFrame dopiero rozpoczyna proces rysowania?
3. Nie bardzo rozumiem, jak to się dzieje że: tworze klasę Dodge. Ok. Rozszerzam ją o klase JPanel. Dlaczego nie muszę rozszerzać o klasę JFrame? A dlaczego muszę rozszerzać o JPanel? Czy ma to związek z tym, że kolejność dziedziczenia jest taka: Object -> Dodge (moja klasa) -> JFrame -> JPanel ? Prosiłbym o łopatologiczne wytłumaczenie bo się pogubiłem.
4. paint(Graphics g) - taki zapis jest możliwy, tak samo (na podobnej zasadzie) jakbym napisał paint(JFrame ramka) ? Czyli lokalnie przy wywołaniu funkcji paint tworzę obiekt g klasy Graphics i mogę dzięki temu z tego obiektu korzystać w tej metodzie? Korzystam z tutoriala. Normalnie napisałbym pewnie w metodzie: Graphics g = new Graphics();