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 :

[Swing][graphics]objets graphiques qui s'effacent


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut [Swing][graphics]objets graphiques qui s'effacent
    Bonjour,

    J'ai créé une application qui permet de crééer des missions d'avions d'arme
    et donc de disposer différents objets sur un terrain.

    Ces objets sont des formes géométriques simples et le terrain est un JPanel.

    Je voudrais que chaque fois que l'utilisateur créé et positionne un nouvel objet,
    le terrain affiche tous les objets qu'il a déjà créé.

    Pour obtenir cette persistence, j'ajoute les objets dans un vecteur et dans la
    méthode paintComponent du terrain j'appel les fonctions de dessin de chacun de ces objets.

    Malheureusement, quand l'utilsateur clique dans le terrain pour
    positionner un nouvel objet tous les anciens objets s'effacent.
    Cet effacement viens de l'appel repaint que je fais quand l'utilsateur clique.
    Pourtant ce repaint devrait appeler la méthode paintComponent
    qui devrait redessiner les objets stockés dans le vecteurs.

    J'ai l'impression que les objets sont bien dessinés mais aussitôt effacés,
    car en forçant le raffraichissement du terrain (en redimentionnant ma fenêtre, par exemple),
    le programme passe dans paintComponent, dessine les objets mais ils disparaissent aussitôt

    Voici les différentes méthodes qui entrent en jeux :

    PaintComponent du terrain (qui hérite d'un JPanel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void paintComponent(Graphics g) {
     
      super.paintComponent(g);
      this.dessinQuadrillage(g);
      this.tracerFondCarte(g);
      if (this.existeObjetActif) { /* Dessin de l'objet actif */	...  }
      this.dessinerObjets();
    }
    DessinerObjets -> dessins des objets du vecteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void dessinerObjets() {
     
      EnvironnementXML mission = this.getMission();
      if (mission.scenarioExiste()) {
         Scenario scenario = mission.getScenario();
         scenario.dessiner(this); /* this = le terrain*/
      }
    }
    Tracer -> méthode qui est appellé par la fonction dessiner() de chacun des objets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void tracer() {
     
      Graphics2D graphiqueTerrain = (Graphics2D)this.terrain.getGraphics();
      graphiqueTerrain.setStroke(new BasicStroke(2.0f));
     
      int x1 = this.pointDepart.getPixels_x(this.terrain.getSecondesParPixel_x());
      int y1 = this.pointDepart.getPixels_y(this.terrain.getSecondesParPixel_y());
     
      graphiqueTerrain.drawLine(x1, y1 .... 
      /* Succession d'éléments simples pour contruire l'objet */				
      graphiqueTerrain.setStroke(new BasicStroke(1.0f));				
    }

    Est ce que j'oublie quelquechose pour forcer le réaffichage des éléments du vecteur?
    Faut il utilser (redefinir) la fonction paint au lieu de PaintComponent ?
    Faut il utilser une autre politique de rafraichissement, avec des update ?


    Merci d'avance

    M@tth
    The first Rule of the fight Club is , you don't talk about fight club ...

  2. #2
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    J'ai peut etre une idée mais bon

    Ya du double buffering pour le dessin dans un JPanel par defaut donc ya le dessin de la future image dans un buffer avant de l'afficher a l'ecran.
    Hors quand tu fais ton dessin tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    super.paintComponent(g); 
      this.dessinQuadrillage(g); 
      this.tracerFondCarte(g); 
      if (this.existeObjetActif) { /* Dessin de l'objet actif */   ...  } 
      this.dessinerObjets();
    Jusqu'a la ligne du dessin de l'objet actif tout va bien tu dessine dans le buffer, mais pour le dessin des objet tu fais appel a la methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics2D graphiqueTerrain = (Graphics2D)this.terrain.getGraphics();
    qui recupere le graphics courant (donc pas le buffer ou sont dessiner les autres objets) et tu dessine sur celui-ci et ca la ou ca coince.

    Je m'explique voila en gros ce qui se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    imageVisible
    dessinQuadrillage dans imageBuffer
    tracerFondCarte dans imageBuffer
    dessinObjetActif dans imageBuffer
    dessinObjetExistant dans imageVisible
    imageVisible devient imageBuffer
    Donc tes objets existant ne sont visible que juste avant que les buffer d'image soit intervertit, c'est pour ca que t'as l'impression qu'il disparaisse...

    Ce que tu peux essayer pour savoir si c'est bien ca, c'est d'enlever le doublebuffering sur ton JPanel (tonPanel.setDoubleBuffered(false), comme ca t'es sur que ca vient de la.
    Et si ca vient bien de la, pour resoudre le probleme faut que comme pour le dessinQuadrillage... tu passe en parametre le graphics g a la methode dessinerObjets(g), pour travailler sur la bonne image.

    En esperant que ce soit ca, sinon : :
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut Merci
    Merci !!

    Le problème venait bien de là.
    Je dessine maintenant les objets dans le buffer
    (en recupèrant le g courant) ils restent affichés

    M@tth
    The first Rule of the fight Club is , you don't talk about fight club ...

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

Discussions similaires

  1. [Spark] Effacer les "objets graphiques" aprés une animation
    Par Elendhil dans le forum Flex
    Réponses: 0
    Dernier message: 23/07/2010, 20h59
  2. un objet qui s'efface d'une liste STL
    Par BruceBoc dans le forum SL & STL
    Réponses: 17
    Dernier message: 21/02/2007, 21h21
  3. [lomboz] fichier web.xml qui s'efface
    Par stago dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 18h00
  4. Réponses: 4
    Dernier message: 09/03/2005, 17h15
  5. Réponses: 3
    Dernier message: 09/02/2003, 01h09

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