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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Superposition d'éléments graphiques
    Par downfall dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 04/07/2008, 15h01
  2. Réponses: 22
    Dernier message: 04/04/2007, 15h24
  3. Effacer des éléments graphiques
    Par benjiprog dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 08/09/2006, 13h44
  4. [Access 2k] PB superposition d'éléments graphiques
    Par elgringo2007 dans le forum Access
    Réponses: 2
    Dernier message: 20/06/2006, 17h06
  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, 20h01

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