ANIMATION DANS UN JPANEL + SURVEILLANCE DE LA SOURIS ET DU CLAVIER

kertimanoff Messages postés 75 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 30 juin 2013 - 14 déc. 2009 à 10:37
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 17 déc. 2009 à 01:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50945-animation-dans-un-jpanel-surveillance-de-la-souris-et-du-clavier

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
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és 34 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 19 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és 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
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és 34 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 19 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és 75 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 30 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és 75 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 30 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és 75 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 30 juin 2013
14 déc. 2009 à 10:37
il faut enlever "package jeu;" de chaque source pour que sa marche en ligne de commande.
Rejoignez-nous