uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 17 déc. 2009 à 01:10
La méthode "repaint" avec les arguments qui définissent le rectangle à redessiner existe dans la classe JComponent. Il n'y a donc rien à redéfinir.
Effectvement, dans la boucle "for" on appelle des "repaint" multiples sur le "Panneau". Quand des repaint() multiples sont appelé sur un composant avant que le premier appel ne soit traité, le Repaintmanager de Swing peut réunir les appels multiples en un seul appel. Donc cela ne risque pas de faire "beaucoup". Quand des appels multiples sont ainsi réunis, le rectangle "clip" résultant est égal à la réunion des rectangles qui sont contenus dans les appels réunis.
pyo656
Messages postés34Date d'inscriptionlundi 11 septembre 2006StatutMembreDernière intervention19 février 2010 16 déc. 2009 à 22:09
Merci pour votre commentaire et explication Uhrand.
Cependant, si on appelle repaint() avec de tels paramètres, il faut la redéfinir je suppose ?
Et, si j'ai bien compris, on appellerait cette méthode à chaque itération pour chaque carré ? Cela ne risque pas de faire "beaucoup" ?
Merci de votre aide :-)
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 16 déc. 2009 à 21:31
Voici quelques réflections au sujet de l'utlisation des threads dans ton exemple. Premièrement, une application Swing doit toujours démarrer sur le "EventDispatchThread" en utilisant la méthode "invokeLater":
public static void main(String[] args) {
Runnable gui = new Runnable() {
public void run() {
int largeur = 200;
int hauteur = 200;
new Fenetre(largeur, hauteur);
}
};
SwingUtilities.invokeLater(gui);
}
Ensuite, pour réaliser l'animation, on utilise un thread d'arrière plan. Par exemple:
new Thread(new Runnable() {
public void run() {
go();
}
}).start();
Dans le thread d'arrière plan, les modifications de l'interface graphique doivent de nouveau être envoyées vers le "EventDispatchThread". Pour ce faire, on utilise généralement la méthode "invokeLater" (ou "invokeAndWait"). Cependant, il existe un petit nombre de méthodes Swing qui font ça automatiquement. On dit également que ces méthodes sont "thread safe". La méthode "repaint" en est un exemple. Cependant, dans la méthode "go", c'est préférable de déplacer le "repaint" vers l'intérieur de la boucle "for" en définissant exactement le rectangle à redessiner:
//On redessine notre Carre
int OFFSET = 1;
pan.repaint(c.getPosX() - OFFSET, c.getPosY() - OFFSET,
c.getLargeur() + OFFSET * 2, c.getHauteur() + OFFSET * 2);
} // fin du for
Ceci nous permet d'optimiser la méthode "paintComponent" en ne redessinant que ce qui est nécessaire, c.à d. ce qui chevauche le rectangle "clip". Par exemple, pour dessiner le fond blanc au début de la méthode "paintComponent":
Rectangle r = g.getClipBounds();
g.fillRect(r.x, r.y, r.width, r.height);
pyo656
Messages postés34Date d'inscriptionlundi 11 septembre 2006StatutMembreDernière intervention19 février 2010 14 déc. 2009 à 17:59
Merci d'avoir pris le temps de lire mon code Kertimanoff.
Pour les 'this', je trouve ça plus lisible de l'utiliser dans les constructeurs car parfois on se retrouve avec des lignes du genre nom nom et this.nom nom est plus compréhensible (le this.nom appartient à la classe et le nom est un paramètre du constructeur)
Pour le temps d'attente, c'est vrai. Mais je ne me suis pas penché là dessus ici :D
kertimanoff
Messages postés75Date d'inscriptionsamedi 3 décembre 2005StatutMembreDernière intervention30 juin 2013 14 déc. 2009 à 12:23
il pourrait étre interraissant aussi de fair dépendre le temps d'attente Thread.sleep(x); en fonction du temps d'execution du reste du code. cela permettrai d'obtenir dans le meilleur des cas un déplacement "aussi rapide" des figures quelque soit la machine. bien qu'ici ce temps est négligeable, et ce n'est pas non plus le sujet. la lisibilité du code et les commentaires son apréciables. Merci
kertimanoff
Messages postés75Date d'inscriptionsamedi 3 décembre 2005StatutMembreDernière intervention30 juin 2013 14 déc. 2009 à 12:10
il n'est également pas necessaire de préciser le "this" aux méthodes qui s'appliquent a l'objet fenêtre tel que setTitle("Click On The Yellow Square");
kertimanoff
Messages postés75Date d'inscriptionsamedi 3 décembre 2005StatutMembreDernière intervention30 juin 2013 14 déc. 2009 à 10:37
il faut enlever "package jeu;" de chaque source pour que sa marche en ligne de commande.
17 déc. 2009 à 01:10
Effectvement, dans la boucle "for" on appelle des "repaint" multiples sur le "Panneau". Quand des repaint() multiples sont appelé sur un composant avant que le premier appel ne soit traité, le Repaintmanager de Swing peut réunir les appels multiples en un seul appel. Donc cela ne risque pas de faire "beaucoup". Quand des appels multiples sont ainsi réunis, le rectangle "clip" résultant est égal à la réunion des rectangles qui sont contenus dans les appels réunis.
16 déc. 2009 à 22:09
Cependant, si on appelle repaint() avec de tels paramètres, il faut la redéfinir je suppose ?
Et, si j'ai bien compris, on appellerait cette méthode à chaque itération pour chaque carré ? Cela ne risque pas de faire "beaucoup" ?
Merci de votre aide :-)
16 déc. 2009 à 21:31
Ensuite, pour réaliser l'animation, on utilise un thread d'arrière plan. Par exemple:
Dans le thread d'arrière plan, les modifications de l'interface graphique doivent de nouveau être envoyées vers le "EventDispatchThread". Pour ce faire, on utilise généralement la méthode "invokeLater" (ou "invokeAndWait"). Cependant, il existe un petit nombre de méthodes Swing qui font ça automatiquement. On dit également que ces méthodes sont "thread safe". La méthode "repaint" en est un exemple. Cependant, dans la méthode "go", c'est préférable de déplacer le "repaint" vers l'intérieur de la boucle "for" en définissant exactement le rectangle à redessiner:
Ceci nous permet d'optimiser la méthode "paintComponent" en ne redessinant que ce qui est nécessaire, c.à d. ce qui chevauche le rectangle "clip". Par exemple, pour dessiner le fond blanc au début de la méthode "paintComponent":
14 déc. 2009 à 17:59
Pour les 'this', je trouve ça plus lisible de l'utiliser dans les constructeurs car parfois on se retrouve avec des lignes du genre nom nom et this.nom nom est plus compréhensible (le this.nom appartient à la classe et le nom est un paramètre du constructeur)
Pour le temps d'attente, c'est vrai. Mais je ne me suis pas penché là dessus ici :D
14 déc. 2009 à 12:23
14 déc. 2009 à 12:10
14 déc. 2009 à 10:37