[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:
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.