bonjour, j'ai une petite question car je n'ai toujours pas tout saisi sur paint, repaint, painComponent.

j'ai crée une petite fenêtre, qui contient un jpanel "contentpane".

Je créé un composant simple : un rectangle rouge sur fond jaune.

je lance le programme : je créé ma feêtre, ok.

En cliquant sur le panel, je créé mon composant que j'ajoute dans le contentpane , mais ce dernier n'apparait pas. En effet, je passe bien dans le constructeur car mon message dans la console apparait, mais je ne vois pas le message du passage par la méthode "paintComponent" overide dédiée, car le message dans la console n'est pas présent. C'est donc normal que le composant ne soit pas apparent, puisque le paintComponent n'est pas réalisé.
Cependant, dans les tutos, on précise que "paintComponent" est parcouru à chaque création d'un objet de type "JComponent". Etrange??

En revanche si je redimensionne la fenêtre, le message du passage dans "paintComponent" apparait et le composant se dessine bien.

Ok, mais pourquoi n'est-il pas apparent dès sa création?? Et pourquoi cette nécessité de "provoquer" artificiellement l'appel au "paintComponent en redimensionnant??


Classe du Composant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Composant extends JComponent {
	private static final long serialVersionUID = 1L;
 
	public Composant (String nom) {
		this.setName (nom);
 
		System.out.println("je passe par le contructeur");
 
	}
 
			//---ré-écriture de "paintComponent" appelée à chaque création d'objet---
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
 
		System.out.println("je passe par paintComponent");
 
			//--- fond du contentPane en jaune + un rectangle rouge ---
				g.setColor(Color.yellow);
				g.fillRect(0,0,getWidth(),getHeight());
				g.setColor(Color.RED); 
				g .fillRect( MyWindow.x0  , MyWindow.y0, 60 , 60);
 
 
 
 
			}	
 
}

classe Contentpane et listener

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 
/*
 * ICI ON DEFINIT LE CONSTRUCTEUR DE FENETRE
 */
 
			@SuppressWarnings("serial")
	public class MyWindow extends JFrame implements MouseListener{
 
			//---MES VARIABLES---
			   JPanel contentpane = new  JPanel() ;
 
 
			 static int x0, y0;
			 int i = 0;
 
			 //---CONSTRUCTEUR DE MYWINDOW---
						/* la fenetre est :
						 * toujours visible, au premier plan,
						 * de taille 800x800,
						 * se ferme quand on clique sur la croix,
						 * sont centrées sur l'écran.
						 * je créé une barre de menu.
						 * 
						*/	
			 public MyWindow (String string)   { 	
						super ();
						this.setTitle(string);
						this.isAlwaysOnTop();		
						this.setSize(500, 500);
						this.setLocationRelativeTo(null);
						this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
						this.setVisible(true);
						this.setContentPane(contentpane);
						contentpane.addMouseListener(this);
					    contentpane.setLayout(new BorderLayout());
					    contentpane.setBackground(Color.cyan);;
					//	contentpane.setLayout(null);
						System.out.println("Après  on a " + contentpane.getLayout());
 
 
 
 
 
					}
 
 
			@Override
			public void mouseClicked(MouseEvent e) {
 
				x0 = e.getX();
				y0 = e.getY();
 
				System.out.println(e.getX() + "  " + e.getY());
				Composant comp1 = new Composant ("nomducomposant");
				contentpane .add( comp1 ) ;
 
				System.out.println( comp1);
			//	contentpane.validate();
 
 
 
 
 
			}
 
 
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
 
			}
 
 
			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
 
			}
 
 
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
 
			}
 
 
			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
 
			}		
 
 
}
MERCI A TOUS!!....