/ / paintComponent i super.paintComponent - java, swing, jpanel, jcomponent

paintComponent i super.paintComponent - java, swing, jpanel, jcomponent

Jestem nowym początkującym Java. Poniżej znajdują się dwie klasy, jedna klasa się rozszerza JComponent, musisz zastąpić paintComponent metoda. Rozciąga się kolejna klasa JPanel, musisz także zastąpić paintComponent metoda.

Dlaczego DrawingPanel klasa (rozszerz JPanel) trzeba zadzwonić super.paintComponent(g) metoda, ale CollageComponent (poszerzać JComponent) nie musi dzwonić super.paintComponent(g)?

Jestem taki skołowany.

public class CollageComponent extends JComponent {

public void paintComponent(Graphics g) {

g.setColor(Color.ORANGE);
g.fillRect(100, 50, 300, 75);

// inner green fill
g.setColor(Color.GREEN);
g.fillOval(300, 75, 100, 75);

}
}


public class DrawingPanel extends JPanel {

public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.ORANGE);
g.fillRect(100, 50, 300, 75);

// inner green fill
g.setColor(Color.GREEN);
g.fillOval(300, 75, 100, 75);

}
}

Odpowiedzi:

3 dla odpowiedzi № 1

Wywołując super.paintComponent () upewniasz się, że domyślne malowanie zostało wykonane dla tego komponentu i tego LAF.

W przypadku JPanel oznacza to, że tło jest malowane. Tło może być różne dla każdego LAF.

W przypadku komponentu JC nie ma domyślnego obrazu, ponieważ każda klasa rozszerzająca JComponent jest odpowiedzialna za upewnienie się, że cały obszar komponentu jest malowany.

W twoim prostym przykładzie kod będzie działał, ponieważJComponent jest domyślnie przezroczysty, co oznacza, że ​​tło jest malowane przez rodzica twojego komponentu. Jeśli całe tło nie jest pomalowane, istnieje możliwość malowania artefaktów pojawiających się w określonych warunkach (których nie pamiętam w tym czasie).

Jeśli jednak jakiś LAF zdecyduje, że chcezainstaluj domyślny obraz dla klasy JComponent, twój kod nigdy nie użyje tego obrazu, a twój komponent będzie wyglądał dziwnie w tym LAF. Więc zawsze bezpieczniej jest wywoływać super.paintComponent () podczas wykonywania niestandardowego malowania.

Edytować:

Standardowy kod do malowania tła to:

if (isOpaque())
{
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}

Wystarczy dodać ten kod na początku metody paintComponent ().


1 dla odpowiedzi nr 2

Zgodnie z wynajmem klasy api java -awt / swing api,Składnikiem jest super klasa kontenera. Dlatego należy wywołać konstruktory klasy nadrzędnej (komponent) z klas podrzędnych (kontener) przy użyciu super słowa kluczowego.