IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Clignotement éléments graphiques


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut Clignotement éléments graphiques
    Bonjour,

    Après de nombreuses recherches, je n'arrive pas à solutionner mon problème et je fais donc appel à vous

    Je suis débutant en java et j'essaye de créer un ptit jeu de plateau en 2D.
    Pour cela je fais appelle des méthodes comme fillrect ou drawimage pour dessiner mes differents composants.
    Le problème est que, quand je saute par exemple avec mon "personnage" (qui est pour l'instant un carré :p) tous les éléments graphiques se mettent à clignoter.
    Si j'ai bien compris les différents sujets qui traitent ce problème, ça vient de l'utilisation de paint() ou repaint() mais je n'arrive à rien.

    Voici le paint dema classe fenetre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void paint (Graphics gfx) {
           g2 = contentPane.getGraphics();
     
            Jeu.affiche(g2);
     
     
        }
    Qui renvoie à la méthode affiche de la classe plateau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void affiche (java.awt.Graphics gfx) {
            gfx.setColor(Color.WHITE);
            gfx.fillRect(PositionX,0,150000,parent.getHeight());
            gfx.setColor(Color.RED);
            gfx.fillRect(PositionX+400,100,50,50);
            joueur.affiche(gfx);
     
            try {
                BufferedImage image = ImageIO.read(new File("C:/Users/Matt/jbproject/Poifo/src/poifo/base.jpg"));
                gfx.drawImage(image, 0, 0, null);
            }catch
    (IOException e){/*...*/}
     
        }

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Première chose à ne pas faire: Faire un accès IO dans la méthode de dessin des composants swing, en effet les accès IO (lecture/écriture de flux fichiers ou autres) sont des opérations lourdes, peu compatibles avec la nécessité de rapidité du dessin.

    Je te conseille donc de faire la lecture de ton image une bonne fois pour toute dans le constructeur de ta classe et de ne pas à la recharger à chaque appel à affiche comme tu le fais actullement.


    Ensuite en ce qui concerne la redéfinition de la méthode paint que tu as fais elle me semble louche

    Tout d'abord pour faire du dessin en java2D il vaut mieux se créer un composant héritant de JComponent ou JPanel et en redéfinir la méthode paintComponent. Puis dans ta méthode paintComponent (ou paint comme tu l'as fais ici) il faut dessiner sur les Graphics qui sont passés en paramètres et non ceux que tu obtiens d'autre part (donc utilise les Graphics en paramètres et non ceux obtenus au moyen d'un appel à getGraphics)

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut
    Bonjour et merci pour ta réponse.

    J'essaye donc dans un premier temps de résoudre ce problème de lecture d'image mais lorsque j'essaye de le faire dans le constructeur de ma classe Fenetre, j'ai une exception qui se soulève.

    Voici le constructeur de ma classe Fenetre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Fenetre() {
            try {
             jbInit();
                Jeu = new Plateau(this);
                BufferedImage image = ImageIO.read(new File("C:/Users/Matt/jbproject/Poifo/src/poifo/base.jpg"));
                g2.drawImage(image, 0, 0, null);
            } catch (Exception exception) {
                exception.printStackTrace();
            }        setDefaultCloseOperation(EXIT_ON_CLOSE);
     
        }

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    g2.drawImage(image, 0, 0, null);
    tu dois le mettre dans la methode paint

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Plus précisément il faut charger l'image lors du constructeur, puis utiliser cette image dans la méthode paintComponent pour la dessiner sur le panel

  6. #6
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut
    Je commence à y voir un peu plus clair et mon programme était vraiment mal fichu :p

    Malgré tout, lorsque je met mon drawImage dans le paint(), ça fonctionne.
    Si je créé une méthode paintComponent() (sur le meme modèle que le paint) avec mon drawimage, l'image en question ne s'affiche pas, comme si paintComponent n'était jamais appelé.

    J'aimerais vraiment comprendre comment fonctionne ce systeme de paint(), paintComponent(). J'ai l'impression que certaines sont appelés automatiquement, d'autres non.

    Merci pour vos réponses et éclaircissements

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le paintComponent n'existe que pour les classes héritant de JComponent (or la JFrame n'en hérite pas)

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    ecrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Override
    public void painComponent(Graphics g){
         			 				g.drawImage(image, 0, 0, null);
    }
    @Override dit au compilateur de verifier que l'on redefinie bien une methode
    De plus cette methode ne doit pas etre definie dans la JFrame car cette classe n'hérite pas de JComponent

  9. #9
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut
    Dans ce cas, où dois-je l'écrire ?

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Dans ce cas dans paint() puisque paintComponent() n'existe pas dans JFrame.

    Cependant il est plus commun (mais pas obligatoire) de dessiner dans un composant heritant de JPanel ou de JComponent (dans ce cas utiliser paintComponent() au lieu de paint()) et d'inserer ce dernier dans la JFrame. Cela permet une meilleur modularisation et reutilisabilite du composant de dessin.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut
    Je pense avoir compris plusieurs chose, je vous explique comment j'ai fait :

    J'ai donc ma classe Fenetre qui est une jFrame, voici le code :

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    package poifo;
     
    import java.awt.BorderLayout;
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.Graphics;
    import java.awt.Color;
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseAdapter;
    import java.awt.Event;
    import javax.sound.*;
     
    import javax.swing.*;
    import java.awt.*;
    import javax.imageio.*;
    import java.io.*;
    import java.awt.image.BufferedImage;
    import com.borland.jbcl.layout.XYLayout;
    import com.borland.jbcl.layout.*;
     
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2008</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class Fenetre extends JFrame  {
        JPanel contentPane;
        BorderLayout borderLayout1 = new BorderLayout();
        Plateau Jeu;
        BufferedImage image;
        OverlayLayout2 overlayLayout21 = new OverlayLayout2();
        public Fenetre() {
            try {
                jbInit();
                Jeu = new Plateau(this);
                image = ImageIO.read(new File(
                        "C:/Users/Matt/jbproject/Poifo/src/poifo/base.jpg"));
     
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            setDefaultCloseOperation(EXIT_ON_CLOSE);
     
        }
     
        /**
         * Component initialization.
         *
         * @throws java.lang.Exception
         */
        private void jbInit() throws Exception {
            contentPane = (JPanel) getContentPane();
            contentPane.setLayout(overlayLayout21);
            this.setResizable(false);
            setSize(new Dimension(526, 384));
            setTitle("Frame Title");
            this.addKeyListener(new Fenetre_this_keyAdapter(this));
            this.addMouseListener(new Fenetre_this_mouseAdapter(this));
     
        }
     
        public void paint(Graphics gfx) {
     
            gfx.drawImage(image, 0, 0, null);
        }
     
     
     
     
        public void this_keyPressed(KeyEvent e) {
            if(e.getKeyCode()==37)
            {
                    Jeu.deplace(20);
                    Jeu.paintComponent(this.getGraphics());
        }
        if(e.getKeyCode()==39)
            {
                    Jeu.deplace(-20);
            Jeu.paintComponent(this.getGraphics());
        }
     
     
        if(e.getKeyCode()==38)
        {
            Jeu.sauter();
     
        }
     
        }
     
     
    }
     
     
    class Fenetre_this_mouseAdapter extends MouseAdapter {
        private Fenetre adaptee;
        Fenetre_this_mouseAdapter(Fenetre adaptee) {
            this.adaptee = adaptee;
        }
     
     
    }
     
     
    class Fenetre_this_keyAdapter extends KeyAdapter {
        private Fenetre adaptee;
        Fenetre_this_keyAdapter(Fenetre adaptee) {
            this.adaptee = adaptee;
        }
     
        public void keyPressed(KeyEvent e) {
            adaptee.this_keyPressed(e);
        }
    }
    Elle renvoie donc à la classe Plateau que j'ai définie comme étant 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
    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
    package poifo;
     
    import javax.swing.ImageIcon;
    import java.awt.Color;
    import java.awt.*;
     
    import javax.swing.*;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2008</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class Plateau extends JPanel {
     
     
        private int PositionX=0;
        public javax.swing.JFrame parent;
        private Joueur joueur;
     
     
        public Plateau(javax.swing.JFrame papa) {
            parent=papa;
            joueur=new Joueur(this);
     
        }
     
        public void paintComponent (java.awt.Graphics gfx) {
            gfx.setColor(Color.WHITE);
            gfx.fillRect(PositionX,0,150000,parent.getHeight());
            gfx.setColor(Color.RED);
            gfx.fillRect(PositionX+400,100,50,50);
            joueur.affiche(gfx);
     
     
     
        }
     
        public void deplace (int pos) {
            PositionX+=pos;
        }
     
        public void sauter () {
            joueur.saute();
     
        }
     
     
    }
    Il y a aussi la classe Joueur qui est importante car elle gère le saut. Quand je déplace mon joueur à gauche et à droite ça ne clignotte plus mais quand je le fait sauter, ça clignotte. Peut etre parce que j'utilise un timer qui appelle la methode deplaceY() de Joueur dans l'actionPerformed

    Voila donc j'aimerais faire un contentPane.add(Jeu); mais ça ne fonctionne pas donc je ne vois pas trop comment faire pour intégrer mon plateau comme jPanel.
    Et comment faire aussi pour que mon joueur ne clignotte plus quand je saute ?

    Merci

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Au premier coup d'oeil, ta gestion des evenements est fausee. Tu ne dois pas faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      public void this_keyPressed(KeyEvent e) {
        if (e.getKeyCode() == 37) {
          Jeu.deplace(20);
          Jeu.paintComponent(this.getGraphics());
        }
        if (e.getKeyCode() == 39) {
          Jeu.deplace(-20);
          Jeu.paintComponent(this.getGraphics());
        }
        if (e.getKeyCode() == 38) {
          Jeu.sauter();
        }
      }
    Mais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      public void this_keyPressed(KeyEvent e) {
        if (e.getKeyCode() == 37) {
          Jeu.deplace(20);
         Jeu.repaint();
        }
        if (e.getKeyCode() == 39) {
          Jeu.deplace(-20);
          Jeu.repaint();
        }
        if (e.getKeyCode() == 38) {
          Jeu.sauter();
          Jeu.repaint();
        }
      }
    EDIT - ah oui tant que j'y suis : attention a la directive import javax.sound.*; En effet le package javax.sound n'existe pas (javax.sound.midi et javax.sound.sampled existent par contre), et certains IDE (NetBeans, JCreator) peuvent eventuellement sortir une erreur empechant la compilation (meme javac -JDK 1.6_03- en ligne de commande plante sur cette erreur) alors qu'apparement sous Eclipse et JBuilder ca passe.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut
    Si je fais ça, lorsque j'appuie sur une touche gauche ou droite le plateau ne se raiffraichit pas donc je vois pas mon joueur se déplacer.

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Je ne peux pas compiler l'ensemble sans toutes les classe necessaires (ex : Joueur). Egalement dans quelle mesure as-tu besoin des layout propres a JBuilder ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  15. #15
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut
    En fait j'ai appris à utiliser Jbuilder depuis le début enfin on nous apprend là dessus à l'iut, c'est peut être pas trop une réference je ne sais pas. Quand je vois les profs et la qualités de leurs programmes ça ne m'étonnerait pas :p

    Bref, j'ai up sur mon ftp le projet Jbuilder :

    http://matt112.free.fr/Poifo.rar

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Non ce n'est pas genant en soit. Le seul probleme c'est que tout ce qui se trouve dans com.borland.jbcl.layout est propre a JBuilder et ne se retrouve pas dans les autres IDE (NetBeans et Eclipse ont egalement leur propres trucs qui ne se retrouvent pas chez les concurrents).

    Alors en regardant de plus pres :

    - par convention, les noms des variables sont ecrits avec leur premiere lettre minuscule : jeu et non pas Jeu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jeu = new Plateau(this);
    - dans ta Fenetre tu dessines l'image et rien d'autre. Il est donc normal que rien ne s'affiche. Un appel a super.paint(gfx); permettrait d'afficher le Plateau s'il etait dans la Fenetre (voir remarque suivante). De toute maniere il parait plus logique que l'image soit dessinee dans le Plateau plutot que dans la Fenetre.

    Deplace donc le chargement de l'image dans le constructeur du Plateau et son rendu dans la surcharge de paintConponent()de cette classe.

    - malgres ton layout proprietaire, ton Plateau n'est jamais ajoute a la Fenetre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    setLayout(new BorderLayout());
    add(jeu, BorderLayout.CENTER);
    - A voir pour plus tard : lorsque tu distribueras ton code dans un JAR le chargement de l'image ne fonctionnera plus car son chemin est ecrit en dur dans ton code.

    Tu dois utiliser le ClassLoader de la classe pour charger l'image celon un chemin relatif. Cela fonctionne aussi bien durant le devel (pour peu que la base du chemin relatif soit sur le CLASSPATH du projet) que dans un JAR.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ClassLoader loader = getClass().getClassLoader();
    URL url = loader.getResource("poifo/base.jpg");
    image = ImageIO.read(url);
    En supposant que src ou classes (le repertoire destination apres compilation du projet) soit sur le CLASSPATH (bien verifier que JBuilder recopie l'image dedans lors de la compilation). Verifier la syntaxe egalement ; je tape ca de memoire.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  17. #17
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut
    Merci pour toutes ces informations.

    Je n'arrive pas à mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    setLayout(new BorderLayout());
    add(jeu, BorderLayout.CENTER);
    Je le met dans le jbinit mais ça lève une exception, je comprend pas trop

  18. #18
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Car ton Plateau est initialise APRES ton jbinit().

    Voici ce que ca deviendrai :

    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
    96
    97
    98
     
    package poifo;
     
    import java.awt.BorderLayout;
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyAdapter;
    import java.awt.event.MouseAdapter;
    import javax.sound.midi.*;
    import javax.sound.sampled.*;
     
    import javax.swing.*;
    import java.awt.*;
    import javax.imageio.*;
    import java.io.*;
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2008</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class Fenetre extends JFrame {
     
      private Plateau jeu;
     
      public Fenetre() {
        try {
          jbInit();
        }
        catch (Exception exception) {
          exception.printStackTrace();
        }
      }
     
      /**
       * Component initialization.
       *
       * @throws java.lang.Exception
       */
      private void jbInit() throws Exception {
        this.setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(526, 384));
        setTitle("Frame Title");
        setLayout(new BorderLayout());
        jeu = new Plateau(this);
        add(jeu, BorderLayout.CENTER);
        addKeyListener(new Fenetre_this_keyAdapter(this));
        addMouseListener(new Fenetre_this_mouseAdapter(this));
      }
     
      public void this_keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
          case KeyEvent.VK_RIGHT:
            jeu.deplace(20);
            break;
          case KeyEvent.VK_LEFT:
            jeu.deplace(-20);
            break;
          case KeyEvent.VK_SPACE:
            jeu.sauter();
            break;
          default:
        }
      }
    }
     
    class Fenetre_this_mouseAdapter extends MouseAdapter {
     
      private Fenetre adaptee;
     
      Fenetre_this_mouseAdapter(Fenetre adaptee) {
        this.adaptee = adaptee;
      }
    }
     
    class Fenetre_this_keyAdapter extends KeyAdapter {
     
      private Fenetre adaptee;
     
      Fenetre_this_keyAdapter(Fenetre adaptee) {
        this.adaptee = adaptee;
      }
     
      public void keyPressed(KeyEvent e) {
        adaptee.this_keyPressed(e);
      }
    }
    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
     
    package poifo;
     
    import java.awt.Color;
    import java.awt.*;
     
    import java.awt.image.BufferedImage;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.*;
     
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2008</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class Plateau extends JPanel {
     
      private int PositionX = 0;
      public javax.swing.JFrame parent;
      private Joueur joueur;
      private BufferedImage image;
     
      public Plateau(javax.swing.JFrame papa) throws Exception {
        parent = papa;
        joueur=new Joueur(this);
        ClassLoader loader = getClass().getClassLoader();
        URL url = loader.getResource("poifo/base.jpg");
        image = ImageIO.read(url);
     
      }
     
      @Override
      public void paintComponent(java.awt.Graphics gfx) {
        gfx.drawImage(image, 0, 0, null);
        gfx.setColor(Color.RED);
        gfx.fillRect(PositionX + 400, 100, 50, 50);
        joueur.affiche(gfx);
      }
     
      public void deplace(int pos) {
        PositionX += pos;
        repaint();
      }
     
      public void sauter() {
        joueur.saute();
        repaint();
      }
    }
    EDIT - enleve le "jeu." devant addKeyListener(new Fenetre_this_keyAdapter(this)); et addMouseListener(new Fenetre_this_mouseAdapter(this));.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  19. #19
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut
    Ok d'accord je comprend mieux le fonctionnement.

    Pour le add il fallait mettre getContentPane().add(jeu, BorderLayout.CENTER);

    Par contre mon joueur ne se déplace plus, enfin mon plateau.
    Je crois que ça vient du repaint() dans la méthode deplace

  20. #20
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Pour le mouvement, voir la note EDIT dans le courier precedent.

    Pour le getContentPane() ca doit venir du fait que tu utilises java 1.4 ou un mode compatibilite 1.4. Cette grousse bourde de Sun a ete rectifiee dans Java 1.5+.

    En gros dans Java 1.2, 1.3, 1.5 et 1.6 faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    frame.setLayout(layout);
    frame.add(component);
    c'est la meme chose que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    frame.getContentPane().setLayout(layout);
    frame.getContentPane().add(component);
    Je te conseille de toute maniere de passer, dans la mesure du possible*, vers une version de Java plus recente.

    *Suivant ce qui est disponible dans ton IDE (Java 5 est supporte par JBuilder 2005/2006 mais Java 6 requiert JBuilder 2007 qui est en fait un derive d'Eclipse ce qui risque de te derouter pas mal. Les 3 sont dispos en version gratuite -Foundation pour 2005/2006 et Turbo pour 2007- chez Borland et CodeGear), ce qui est impose par ton envirronement de travail (ce dont tu disposes a la Fac).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Superposition d'éléments graphiques
    Par downfall dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 04/07/2008, 16h01
  2. Réponses: 22
    Dernier message: 04/04/2007, 16h24
  3. Effacer des éléments graphiques
    Par benjiprog dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 08/09/2006, 14h44
  4. [Access 2k] PB superposition d'éléments graphiques
    Par elgringo2007 dans le forum Access
    Réponses: 2
    Dernier message: 20/06/2006, 18h06
  5. [CSS] Apparence des éléments graphiques (boutons, ...)
    Par oursblanc dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 28/02/2006, 21h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo