begin process at 2012 02 04 14:33:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Jeux

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

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


 Description

Cliquez pour voir la capture en taille normale
Un mini-jeu "ClickOnTheYellowSquare" qui montre comment faire une petite animation 2D avec un JPanel (+ comment dessiner des éléments). La source montre aussi comment utiliser le MouseEvent et le MouseListener : le jeu va compter le nombre de clics effectués à gauche, à droite et sur le carré jaune.
Un carré rouge est dessiné au centre de la moitié gauche et un rond bleu est dessiné au centre de la moitié droite. Une ligne est tracée à la moitié pour séparer les 2.

De plus, une classe "EcouteClavier" va écouter le clavier et sitôt que le "mot magique" est tapé (ici, 'javafr'), une Jdialog s'ouvre en affichant un message.

J'ai codé cette source pour moi-même apprendre comment utiliser l'objet Graphic et Graphic2D.

Dans la classe Panneau, on peut ajouter des Carre.
Attention, si vous mettez beaucoup de carrés, cela risque de "lagger", d'avoir des ralentissements.

Source

  • package jeu;
  • import java.util.ArrayList;
  • import javax.swing.JFrame;
  • public class Fenetre extends JFrame {
  • Panneau pan = new Panneau();
  • public Fenetre(int longueur, int largeur){
  • this.setTitle("Click On The Yellow Square");
  • this.setSize(longueur, largeur);
  • // se positionne au centre
  • this.setLocationRelativeTo(null);
  • // Ferme-toi lorsqu'on clique sur "Fermer" !
  • this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  • //On prévient notre JFrame que ce sera notre JPanel qui sera son contentPane
  • this.setContentPane(pan);
  • addKeyListener(new EcouteClavier());
  • // this.setAlwaysOnTop(true);
  • this.pack();
  • this.setDefaultLookAndFeelDecorated(true);
  • this.setExtendedState(this.MAXIMIZED_BOTH);
  • this.setVisible(true);
  • go();
  • }
  • private void go(){
  • ArrayList list = pan.getListeCarres();
  • Object[] tmp = list.toArray();
  • while(true){
  • for(int i=0;i<tmp.length;i++)
  • {
  • Carre c = (Carre) tmp[i];
  • int x = c.getPosX(), y = c.getPosY();
  • //Si la coordonnée x est inférieure à 1, on avance
  • if(x < 1) c.setBackX(false);
  • //Si la coordonnée x est supérieure à la taille du Panneau
  • //moins la taille du carre, on recule
  • if(x > pan.getWidth()- c.getLargeur()) c.setBackX(true);
  • //idem pour l'axe Y
  • if(y < 1) c.setBackY(false);
  • if(y > pan.getHeight()-c.getHauteur()) c.setBackY(true);
  • //Si on avance, on incrémente la coordonnée
  • if(!c.getBackX())
  • c.setPosX(++x);
  • //Sinon, on décrémente
  • else
  • c.setPosX(--x);
  • //Idem pour l'axe Y
  • if(!c.getBackY())
  • c.setPosY(++y);
  • else
  • c.setPosY(--y);
  • } // fin du for
  • try {
  • Thread.sleep(15);
  • } catch (InterruptedException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • }
  • //On redessine notre Panneau
  • pan.repaint();
  • } // fin du while
  • }
  • }
package jeu;

import java.util.ArrayList;
import javax.swing.JFrame;

public class Fenetre extends JFrame {

Panneau pan = new Panneau();

     public Fenetre(int longueur, int largeur){

         this.setTitle("Click On The Yellow Square");
         this.setSize(longueur, largeur);
         // se positionne au centre
         this.setLocationRelativeTo(null);
         // Ferme-toi lorsqu'on clique sur "Fermer" !
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         //On prévient notre JFrame que ce sera notre JPanel qui sera son contentPane

         this.setContentPane(pan);

         addKeyListener(new EcouteClavier());
         // this.setAlwaysOnTop(true);

         
        this.pack();

        this.setDefaultLookAndFeelDecorated(true);
        this.setExtendedState(this.MAXIMIZED_BOTH);

         this.setVisible(true);

         go();
     }

        private void go(){

                ArrayList list = pan.getListeCarres();
                Object[] tmp = list.toArray();

               while(true){
                        for(int i=0;i<tmp.length;i++)
                        {
                            Carre c = (Carre) tmp[i];

                            int x = c.getPosX(), y = c.getPosY();
                        //Si la coordonnée x est inférieure à 1, on avance
                        if(x < 1)  c.setBackX(false);
                        //Si la coordonnée x est supérieure à la taille du Panneau
                        //moins la taille du carre, on recule
                        if(x > pan.getWidth()- c.getLargeur()) c.setBackX(true);

                        //idem pour l'axe Y
                        if(y < 1) c.setBackY(false);
                        if(y > pan.getHeight()-c.getHauteur()) c.setBackY(true);

                        //Si on avance, on incrémente la coordonnée
                        if(!c.getBackX())
                                c.setPosX(++x);
                        //Sinon, on décrémente
                        else
                                c.setPosX(--x);

                        //Idem pour l'axe Y
                        if(!c.getBackY())
                                c.setPosY(++y);
                        else
                                c.setPosY(--y);

                        } // fin du for

                    
                     try {
                                Thread.sleep(15);
                     } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                     }

                        //On redessine notre Panneau
                     pan.repaint();
                 } // fin du while 
        }
}

 Conclusion

Une petite source assez bête mais qui montre une utilisation simple des Graphic, Graphic2D, MouseListener et KeyListener.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture LETMESEE : CAPTURE D'ÉCRAN À INTERVALLE RÉGULIER : UTILISATI...
CRYPTAGE SELON LA MÉTHODE DE CÉSAR

 Sources de la même categorie

Source avec Zip Source avec une capture [MIDP] SIMPLE CHESS BOARD par loloof64
Source avec Zip Source avec une capture JEU DE DAMES par Julien39
Source avec Zip BLACKBOX SWING ET JAVA2D par GodConan
Source avec Zip Source avec une capture COMBAT DE SERPENTS VERSION MIDLET par khilio
Source avec Zip Source avec une capture COMBAT DE SERPENTS par khilio

 Sources en rapport avec celle ci

Source avec Zip CLASS SPRITE par T_Mehdi
Source avec Zip Source avec une capture SUITE JAVA par ralebole
Source avec Zip POURSUIVRE UNE FENETRE AVEC SA SOURIS par Alpha_cafe
Source avec Zip Source avec une capture GRAPHE ORIENTÉ ET DIJKSTRA par Bel0

Commentaires et avis

Commentaire de kertimanoff le 14/12/2009 10:37:29

il faut enlever "package jeu;" de chaque source pour que sa marche en ligne de commande.

Commentaire de kertimanoff le 14/12/2009 12:10:48

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

Commentaire de kertimanoff le 14/12/2009 12:23:24 8/10

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

Commentaire de pyo656 le 14/12/2009 17:59:41

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

Commentaire de uhrand le 16/12/2009 21:31:44

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":
[code]
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);
}
[/code]
Ensuite, pour réaliser l'animation, on utilise un thread d'arrière plan. Par exemple:
[code]
new Thread(new Runnable() {
    public void run() {
        go();
    }
}).start();
[/code]
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:
[code]
    //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
[/code]
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":
[code]
Rectangle r = g.getClipBounds();
g.fillRect(r.x, r.y, r.width, r.height);
[/code]

Commentaire de pyo656 le 16/12/2009 22:09:17

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

Commentaire de uhrand le 17/12/2009 01:10:26

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

MouseListener sur des boutons dans une applet [ par Nabel ] voilà mon pb : j'ai une applet dans la quelle j'ai mis des boutons et j'aimerai que quelquechose s'affiche lors je passe ma souris sur le bouton.Je sa mouseListener, déclaration d'events [ par aska ] Je réalise un programme avce une interface graphique souri avec l'utilisateur.Dans une classe point , j'ai implementer les mouseXXX , la méthode mouse Tutoriel Java.Graphic et Java.2d [ par Sw1tch ] Bonjour à tous,je recherche un bon tutoriel sur l'utilisation de la classe graphic et 2d en java, en français si possible, en anglais sinon... Une exp MouseListener & ActionListener [ par swiss_cheese10 ] Bijour tout le monde !Sur ma fenêtre, j'ai des boutons auxquels j'attribue un évènement (ActionListener) et j'aimerais utiliser un évènement de souris Probleme avec les MouseListener et MouseMotionListener [ par vinceP ] Bonjour, Voila j'ai ecris 2 classes une qui contient la jframe Main (swing donc ...) et une autre classe Photo qui affiche une image avec les coordon java et le buffering graphic [ par ron2000 ] Je fais du graphique dans une applet java, et ca mets du temps à s'afficher. j'utilise le plus souvent : g.drawstring("tzqtr",10,50); et Récuperer les coordonnées de la souris sur l'écran [ par SkiVox ] Comment fais t on pr récupere les coordonée du pointeur de la souris sur lecran ?MouseListener mouseListener = new MouseAdapter(){ if (e.getButton( MouseListener sur unJPanel [ par TheBigBossJeff ] Bonjour &#224; tous. Voila &#231;a fait quelque temps que je me plaits &#224; essayer le java. Pour l'instant j'ai r&#233;ussi &#224; me d&#233;broui JTree et MouseListener [ par nounouX ] Salut a tous, Voila je suis toujours sur mon "messenger like" :D, bon grace a vos conseille j ai reussi a faire un jolie Jtree etc... seulement voila, MouseListener sur JTable désactivée [ par mdrcedrick ] bonjour à tous j'ai une JTable que j'ai désactivée pour ne pas pouvoir en modifier le contenu seulement j'aurai quand même besoin de pouvoir cliquer s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales