Java: Effacer contenu d'un panel

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Java: Effacer contenu d'un panel

par Rockleader » 03 Déc 2016, 21:39

Salut,

j'ai un léger problème conceptuel, en fait je pourrais élaborer une solution qui fonctionne mais j'ai l'impression que ce serait juste coller un pansement pour pas voir le saignement x)

J'explique rapidement:

J'ai un panel sur lequel interagissent plusieurs event.

L'idée c'est que si je clique sur mon panel, je vais stocker un point dans une liste.
Puis, en fonction de la position de ma souris, je vais tracer la ligne allant du point à la souris.

Cette partie là fonctionne, mais le soucis, c'est que si je trace, il faut aussi que j'efface l'ancien trait temporaire.

Ma première idée était en fait de redessiner un trait blanc par dessus pour cacher le trait noir; à l'exécution pour l'user ça fonctionne, mais ça me dérange et me donne l'impression de passer à coté de quelque chose d'essentiel.

En espérant que vous puissiez m'indiquer.

Voici l'extrait de code que j'ai mis en place

Les fonctions classiques add et remove d'une array list.
Code: Tout sélectionner
public void ajouterPoint(Point p){
        lignesTempo.add(p);
    }
   
    public void supprimerDernierPoint(){
        lignesTempo.remove(lignesTempo.size()-1);
    }
   


La fonction qui trace la ligne temporaire

Ici Point temp représente la position actuelle de la souris il s'agit du point généré par l'event mouseMoved

Code: Tout sélectionner
    public void tracerLigneTemporaire(Point temp){
        System.out.println("Dessin");
        int cpt=0;
        Point last=null;
        Graphics g=zoneDessin.getGraphics();
        for(Point p:lignesTempo){
             if(cpt==lignesTempo.size()-1){
                //dernier point de la liste, on trace la ligne temp
                ligneDark(g,p,temp);
            }else{
                 if(cpt%2!=0){
                //nbPoints pairs on trace la ligne
                ligneDark(g,last,p);
                }
            }
            last=p;
            cpt++;
        }
       
    }


La fonction qui trace la ligne

Code: Tout sélectionner
public void ligneDark(Graphics g,Point source,Point destination){
   setBackground(Color.black);
   g.drawLine(source.x,source.y,destination.x,destination.y);
}


Je ne mets pas les events car je suis sûr que c'est ok de ce coté là, le problème vient juste du fait que je veux pouvoir effacer une ligne qui n'est pas fixé tant que je n'ai pas fait l'ajout définitif du point par un clic.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Java: Effacer contenu d'un panel

par fatal_error » 05 Déc 2016, 00:12

ce que tu proposes ne marche pas. Si tu traces un polygone. et que ta nouvelle droite intersecte le polygone, alors tu vas ajouter un pixel blanc en plein sur ton arrête...

tu peux lire http://stackoverflow.com/questions/3137 ... -good-idea

pour faire court par ordre de préférence, soit tu :
- replottes tout depuis le début (ce que je te conseille si tu fais un truc trivial type polygone)
- copie ton canvas dans buffer à chaque fois que tu valides ta droite. quand tu "bouges" ta souris, tu restores ton buffer et trace ta droite.
- tu superposes ton buffer copié sous le canvas rempli de pixels transparents (sauf là ou tu traces ta droite). A chaque fois que tu bouges ta souris, tu refilles le canvas (accessoirement de la taille de ta droite) avec les pixels transparents.

Parenthèse, remplir un rectangle est probablement plus rapide en terme CPU et GPU que tracer une droite (par ex à cause de lantialiasing). (à vérifier)
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Re: Java: Effacer contenu d'un panel

par Rockleader » 05 Déc 2016, 02:20

Si je me rappelle bien de ce qu'on nous avais préconisé, l'idée était plutôt de stocker tous les traits pour les redessiner à chaque fois.

Donc en fait, à moins que je sois complètement à coté de la plaque, c'est comme si à chaque event je repartais d'un panel totalement vide. Sauf que c'est ça que je ne sais pas faire; je me vois pas me retaper un new panel avec toutes les initialisations à chaque mouvement de la souris ce serait beaucoup trop lourd. Quoi qu'il en soit techniquement parlant c'est là que je bloque^^
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Java: Effacer contenu d'un panel

par fatal_error » 05 Déc 2016, 08:20

Code: Tout sélectionner
avec toutes les initialisations à chaque mouvement de la souris ce serait beaucoup trop lourd


si linitialisation de ton panel coute trop lourd ... (merci java)
tu fill un rectangle blanc ce qui feint un nouveau panel.
tracer des lignes c'est bidon (et rapide). Si t'envoies 200pts, idem 50 droites, ca te fait 200 int, idem 800 octets sur archi classique.
le taux de transfer cpu<>gpu c'est environ 6GB/s, je te laisse faire le calcul...
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Re: Java: Effacer contenu d'un panel

par Rockleader » 05 Déc 2016, 19:48

Bon ben en fait ce que j'avais jamais compris c'est que la méthode paintComponent fait automatiquement un nettoyage après l'appel; donc en gros l'idée c'est de stocker l'ensemble du dessin et de le refaire à chaque event comme j'étais partie pour le faire, sauf que je cherchais un méthode pour effacer qui n'avait pas besoin d'être^^


Par contre, on voit bien le cout des initialisations à chaque fois qui fait mal ahah x)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite