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

paintComponent and super.paintComponent - java, balançoire, jpanel, jcomponent

Je suis nouveau débutant en Java. Ci-dessous deux classes, une classe s'étend JComponent, besoin de passer outre le paintComponent méthode. Une autre classe s'étend JPanel, doivent également passer outre le paintComponent méthode.

Pourquoi DrawingPanel classe (étendre JPanel) besoin d'appeler super.paintComponent(g) méthode, mais le CollageComponent (étendre JComponent) n’a pas besoin d’appeler super.paintComponent(g)?

Je suis tellement confus.

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);

}
}

Réponses:

3 pour la réponse № 1

En appelant super.paintComponent (), vous vous assurez que le dessin par défaut est effectué pour ce composant et ce fichier LAF.

Pour un JPanel, cela signifie essentiellement que le fond est peint. Le fond peut être différent pour chaque LAF.

Pour un composant JComponent, il n'y a pas vraiment de peinture par défaut puisque chaque classe qui étend JComponent est responsable de s'assurer que toute la zone du composant est peinte.

Dans votre exemple simple, le code fonctionnera parce queJComponent est transparent par défaut, ce qui signifie que l’arrière-plan est peint par le parent de votre composant. Si tout l’arrière-plan n’est pas peint, il est possible de peindre des artefacts apparaissant dans certaines conditions (ce dont je ne me souviens pas pour l’instant).

Cependant, si un LAF décide qu'il souhaiteinstallez le dessin par défaut pour la classe JComponent, votre code n’utilisera jamais ce dessin et votre composant aura l’air étrange dans ce LAF. Il est donc toujours plus sûr d'appeler super.paintComponent () lors de la peinture personnalisée.

Modifier:

Le code standard pour peindre un fond est:

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

Vous n'aurez qu'à ajouter ce code au début de la méthode paintComponent ().


1 pour la réponse № 2

Selon le hirearchy des classes java -awt / swing api,Le composant est la super classe de Container. Par conséquent, vous devez appeler les constructeurs de la classe Parent (Component) à partir de classes enfants (Container) à l'aide du mot-clé super.