Salut à vous !
Dans ma découverte des GUI avec java, je suis confronté à un second problème.
Tout d'abord, le code source:
Une fenêtre de type JFrame
Contenant un JPanel
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 package test; import javax.swing.JFrame; public class TestFrame extends JFrame { private TestPanel tp_; public TestFrame(){ tp_ = new TestPanel(); getContentPane().add(tp_); pack(); } public static void main(String args[]){ TestFrame tf = new TestFrame(); tf.setVisible(true); } }
Qui contient des composants perso
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 package test; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import javax.swing.ImageIcon; import javax.swing.JPanel; import java.net.URL; public class TestPanel extends JPanel{ private static Image background_; public TestPanel() { setPreferredSize(500,500); URL backgroundURL = this.getClass().getResource("background.jpg"); background_ = new ImageIcon(backgroundURL).getImage(); this.add(new ComposantPerso1(new Point(50,50))); this.add(new ComposantPerso1(new Point(100,100))); } public void paint(Graphics g){ g.drawImage(background_,0,0,this); // dessine l'image de fond -> FONCTIONNE // Appel recursif cradingue à repaint() mais bon ... repaint(); // devrait appeler le paint() des composants non ? -> FONCTIONNE PAS: les composants ne s'affichent pas } }
Je m'explique avec plus de détail:
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 package test; import java.awt.Color; import java.awt.Point; import java.awt.Graphics; import javax.swing.JComponent; public class ComposantPerso1 extends JComponent{ private static Color couleur_ = Color.BLACK; private Point coordonnees_; public ComposantPerso1() { super(); } public ComposantPerso1(Point coordonnees){ this(); coordonnees_ = coordonnees; System.out.println("======================== Creation ComposantPerso1"); } public void paint(Graphics g){ g.setColor(couleur_); g.fillRect(coordonnees_.x, coordonnees_.y, 10,10); System.out.println("======================== appel a paint() du composant perso"); // Jamais printé. } }
Je possède des composants graphiques (ComposantPersoXX) qui représentent l'état d'objets modèles. (J'essaie de mettre en place le pattern MVC correctement.)
Ces composants devraient pouvoir se modifier en fonction des modifications apportées au modèle. Pour cela je mets en place le pattern Observer, en faisant implementer mes ComposantPersoXX de l'interface Observer ().
Mes composants ont donc une méthode update() que je n'ai pas fait figurer ici pour plus de clarté.
Mon problème majeur est que les composants ne s'affichent pas du tout dans le JPanel. On peut voir qu'aucun appel à la méthode paint() de ComposantPerso1 n'est jamais effectué.
Pourriez vous m'expliquer pourquoi ? (D'autant plus que mon jPanel sait qu'il a un composant ...Pourquoi ne les paint il pas lorsqu'il reçoit un repaint() ? )
En tout cas merci et bonne fin de journée![]()
Partager