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

2D Java Discussion :

[applet][double buffering][mouseEvent] paint paresseux


Sujet :

2D Java

  1. #1
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 68
    Points : 72
    Points
    72
    Par défaut [applet][double buffering][mouseEvent] paint paresseux
    Bonjour,
    j'ai une applet.
    Pour éviter le scintillement, j'utilise le double-buffering.
    Quand le curseur de la souris bouge, je dessine des traits en me basant sur la position de la souris.

    J'ai docn un objet zoneDessin qui étends la classe Canvas. Cet objet possède un listener mouseMoved qui appelle une méthode. Cette méthode efface l'Image précédemment créée, puis redessine les traits et ensuite les affiche.
    En simplifiant 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
     
     
    public class zoneDessin extends Applet implements MouseListener,MouseMotionListener{
     
     Image monImage;
     Graphics monGraphics;
     int i=0;
     
     public zoneDessin(){
      init();
     }
     
     public void paint(Graphics g){
      system.out.prinln("je peins "+i);
      i++;
      g.drawImage(monImage,0,0,500,500,this); 
     }
     public void update(Graphics g){
      paint(g);
     }
     
     private void init(){
      monImage=this.createImage(500,500);
      monGraphics=monImage.getGraphics();
     }
     
     private void dessine(int x, int y){
      init();
      monGraphics.drawLine(x,y,x+100,y+100);
      monGraphics.drawLine(x,y,x+100,y-100);
      this.repaint();
    }
     
     public void mouseMoved(MouseEvent evt){		
      dessine(evt.getX(), evt.getY());
     }
     
    	public void mouseClicked(MouseEvent evt) {}
        public void mouseEntered(MouseEvent evt){}
        public void mouseExited(MouseEvent evt){}
        public void mousePressed(MouseEvent evt) { }
        public void mouseDragged(MouseEvent evt){ }    
        public void mouseReleased(MouseEvent evt){ }   
    }
    Le problème is quand on fait glisser le curseur sur la zone en question, l'affichage des traits ne se fait que quand le curseur de la souris a arrêté de bouger, comme si suel l'évènement "arrêt bougeage souris" était pris en compte alors que dnas la sorite système, j'ai bien :

    je peins 0
    je pens 1
    je peins 2
    je peins 3
    je peins 4
    ...
    je peins 50
    Quelqu'un aurait une idée ?

    Merci

  2. #2
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    au secours les gens ! aidez moi ! sivouplé !
    une diée ? un conseil ? quelquechose ! me laisser pas crier tout seul dnas l'espace !

  3. #3
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Tant qu'a faire un UP, essayes de le faire discret la prochaine fois, si l'idee etait de te faire mal voir ca risque d'etre reussi ..

    Suggestions (au hasard car pas expert java2D): il faudrait peut-etre lui dire que qqchose a changer a ton composant, genre un revalidate ou un repaint ou je ne sais pas quoi d'autre ...

    2eme point: Je ne sais pas si certains sont habitue du double-buffering sur le forum, mais est-ce vraiment la methode a employer pour faire ca (je parle de la creation d'une nouvelle image a chaque mouvement de souris)...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  4. #4
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    c'est quoi un UP ? mon but c'était juste de faire remonter le post avant qu'il ne disparaisse dnas les limbes sans réponseS.

    effectivmeent, j'ai oublié de mettre la commande repaint(), je la mets là ou elle doit être.

    Quand à savoir si le double-buffering est adapté, disons que c'ets tous ce que j'ai trouvé pour éviter le scintillement.
    Celà dit je suis ouvert à toute proposition.

  5. #5
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    pour être plus précis, ce que je montre ce n'est qu'une applet pour mettre en exergue mon pb.
    L'applet sur laquelle je travaille, affiche deux courbes à 600 points chacune. Je ne peux aps me contenter de mettre les méthodes de dessin dnas le paint(). Pour avoir déjà essayé, ça scintillement monstreusement. ALors je suis obligé d'utiliser le double buffering. Et je l'utilise duc oup pour tous mes éléments graphiques (courbes, quadrillage, croix suivant le curseur).
    Il apparaît évident que pour suivre le cursuer la méthode paint() toute simple est plus efficace. (Tps de répons emoins long). Cependant, je ne vois aps trop comment marrier les deux solutions.

  6. #6
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    point 1: un UP c'est ce que tu as fait en postant dans l'enfilade pour faire remonter le thread dans la liste des messages (plus discret aurait ete mieux c'est tout)

    point 2: le double-buffering est la methode a employer, c'est plutot la facon dont tu l'implementes qui me paraissait suspecte, mais comme je l'ai dit je ne suis pas un expert dans le domaine et j'ai pas trop le temps de me pencher la-dessus.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  7. #7
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    ben enf ait, la méthode du double buffering, je l'ai pas inventé. je l'ai repompé dans les cours java de developpez.com.
    Donc, si j'ai merdoyé à l'implémentation, quelqu'un pourrait me dire où?

    merci.

  8. #8
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    bon ben comme on n'est jamais mieux aidé que par soi-même j'ai fini par trouver.
    Ce qui ralentit énormément mon applet, c'est pas le double buffering en soi.
    C'est la (re)initialisation des objet Image et Graphics. En la supprimant, on a une applet fluide. Plutôt que de reinitialiser les objets Graphics et Image pour avoir une zone vierge, il suffit tout bêtement de redessiner un gros rectangle de la taille de la zone d'affichage pour tout effacer.
    C'est tellement idiot que j'y avais pas pensé. Comme quoi, c'est toujours le truc le plus bête et le plus simple qui marche le mieux.

    Donc, le code de l'applet en double buffering qui est toute fluide c'est :

    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
     
    import java.awt.*;
    import java.applet.*;
    import java.awt.event.*;
     
    public class zoneDessin extends Applet implements MouseListener, MouseMotionListener{ 
     
     Image monImage; 
     Graphics monGraphics; 
     int i=0; 
     Color colFonds=new Color(255,255,255);
     
     
     public void paint(Graphics g){ 
      g.drawImage(monImage,0,0,500,500,this); 
     } 
     public void update(Graphics g){ 
      paint(g); 
     } 
     private void dessineLeFond(){
      monGraphics.setColor(colFonds);
      monGraphics.fillRect(0,0,500,500);
     }
     
     public void init(){ 
      monImage=this.createImage(500,500); 
      monGraphics=monImage.getGraphics(); 
      dessineLeFond();
      this.addMouseListener(this);
      this.addMouseMotionListener(this);
     } 
     
     private void dessine(int x, int y){ 
      dessineLeFond();
      monGraphics.setColor(new Color(0,0,0)); 
      monGraphics.drawLine(x,y,x,0);
      monGraphics.drawLine(x,y,0,y);
      this.repaint(); 
    } 
     
     public void mouseMoved(MouseEvent evt){       
      dessine(evt.getX(), evt.getY()); 
     }
     
    	public void mouseClicked(MouseEvent evt) {}
        public void mouseEntered(MouseEvent evt){}
        public void mouseExited(MouseEvent evt){}
        public void mousePressed(MouseEvent evt) { }
        public void mouseDragged(MouseEvent evt){ }    
        public void mouseReleased(MouseEvent evt){ }   
    }

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

Discussions similaires

  1. [Dessin]Double Buffering + Components
    Par Higestromm dans le forum 2D
    Réponses: 1
    Dernier message: 04/07/2005, 15h11
  2. [GDI+] Double buffer
    Par sebbb dans le forum MFC
    Réponses: 3
    Dernier message: 24/05/2005, 15h19
  3. [MFC] Scinttillement vs Double buffering
    Par DamessS dans le forum MFC
    Réponses: 9
    Dernier message: 07/04/2005, 09h01
  4. Réponses: 1
    Dernier message: 04/04/2005, 11h19
  5. [Exception]Double buffering & NullPointerException
    Par Seiya dans le forum API standards et tierces
    Réponses: 25
    Dernier message: 09/07/2004, 18h41

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