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][Paint] Logique de dessin


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Par défaut [Swing][Paint] Logique de dessin
    Bonjour,

    Je développe une application qui tournera sur une tablette tactile et je dois y inserer une 'zone de prise de notes libre'.
    En gros l'utilisateur peut ecrire dans cette zone et j'affiche ce qu'il ecrit.

    Le mecanisme que j'ai mis en place est le suivant :
    • Le composant est un JPanel qui écoutes les évènement Mouse et MouseMotion.
    • Sur mouseDragged j'enregistre les points.
    • Sur mousePressed et mouseReleased je gère le lever de stylo (pour enregistrer les points suivant dans un nouveau 'trait').
    • Le dessin se fait dans la methode 'paint' du JPanel en traçant des lignes entre les points successifs appartement au même 'trait'.


    Pour déclencher le dessin, j'ai ajouté un Timer Swing au JPanel qui va provoquer un repaint() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    new Timer(100, new ActionListener(){
         public void actionPerformed(ActionEvent e) {            
              repaint();
         }
    }).start();
    Le problème (il faut bien qu'il y en ai un, sinon je ne serais pas ici ) c'est que plus l'utilisateur dessine dans le composant moins le tracé deviens fluide.
    L'origine de ce problème vient du dessin de toutes les lignes entre les points qui devient de plus en plus long (forcement car il y a de plus en plus de points à afficher).
    J'ai constaté que la fréquence à laquelle je recevais des points par le 'mouseDragged' diminue progressivement et se fait pas accoups.
    J'ai l'impression que, comme le tracé des points est fait dans l'Event dispatcher (du moins c'est ce que je crois au vu de la description du Timer Swing ), il 'gène' la transmission des évènements souris vers mon listener qui enregistre ainsi de moins en moins de points.

    Est-ce que vous avez une solution à me proposer pour fluidifier le tracé (et le rendre indépendant de la quantité de points qu'il contient) ?
    • Utiliser un Timer util au lien du timer swing ?
    • Ne pas utiliser de Timer mais un autre mécanisme de rafraichissment ?
    • Utiliser le double buffering ? (comment le mettre en place ?)
    • Ne pas utiliser paint() mais une autre methode (update ? paintComponent ?)
    • Dessiner differement le tracé ? (drawPolyline au lieu des drawLine ?)


    NB : j'ai essayé sans timer, en appelant le repaint après chaque nouveau point dans le mouseDragged mais le résultat est le même.

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Salut,

    Il faut faire un petit "algo" qui te permet de ne pas redessiner à chaque fois tout. Surtout que tu as deja fait le travail!
    Les points de ta souris sont mis dans un tableau ou un vecteur, je supose. Vide le à chaque fois pour y mettre que les plus ressants et ajout à ton dernier dessin un nouveau dessin construit à partir des derniers points.
    Bref, tu fais de la superposition de dessin et non une nouvelle création à chaque fois.

    Bonne chance.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 911
    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 911
    Billets dans le blog
    54
    Par défaut
    Pourrais-tu nous montrer comment tu dessines tes points s'il te plait ? Combien de points en moyenne as-tu quand cela commence a reagir lentement ?
    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

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    plutot qu'un timer,

    tu pourrais faire un thread en priorité minimum pour redessiner.
    Le dessin serat un peu en retard a l'affichage mais du coté du nombre de point pendant qu'il dessine, ca devrait etre mieux.

  5. #5
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Une autre idée serait de peindre dans une BufferedImage, puis d'afficher l'image dans ton composant. Comme ça, l'image n'est pas réinitialisée et tu n'as pas besoin de redessiner tous les anciens points à chaque repaint.

    Bien sûr, tout garder dans une List permet de faire du undo, c'est bien pratique.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Citation Envoyé par xavlours
    Une autre idée serait de peindre dans une BufferedImage, puis d'afficher l'image dans ton composant. Comme ça, l'image n'est pas réinitialisée et tu n'as pas besoin de redessiner tous les anciens points à chaque repaint.

    Bien sûr, tout garder dans une List permet de faire du undo, c'est bien pratique.
    je suis d'accord à 100%

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

Discussions similaires

  1. Elément Swing, drag&drop et dessin
    Par Torx26 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 08/07/2015, 20h47
  2. [Swing][Graphics2D] dessiner une flèche
    Par Galima dans le forum 2D
    Réponses: 13
    Dernier message: 03/12/2011, 23h31
  3. Swing Paint : setComposite()
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 19
    Dernier message: 02/06/2008, 07h34
  4. Réponses: 1
    Dernier message: 24/08/2007, 02h51
  5. Réponses: 4
    Dernier message: 20/06/2007, 12h15

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