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 :

Mon dessin s'efface, et j'ai essayé diverses choses


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut Mon dessin s'efface, et j'ai essayé diverses choses
    Bonjour,

    Je sais que cette question revient souvent, mais là je ne trouve pas. La classe TracePlan calcule les coordonnées des points à tracer, puis donne l'ordre de les imprimer à l'écran :


    Code java : 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
    class TracePlan extends AbstractAction{
    public TracePlan (PlanC C1, ValTransfo[] TDP, int nT, Panneau pan)
            {this.C1 = C1;
            this.TDP = TDP;    //Tableaux de valeurs.
            this.nT = nT;    
            this.pan = pan;    //Le panneau où sera tracé le dessin.
            }
     
        public void actionPerformed (ActionEvent e)
            {NbrePts = C1.getNombrePoints();
            ZoomVal = C1.getZooming();
     
        /*etc., suite à cette récupération des valeurs vient une série de calculs
        de coordnnées des points à tracer*/
     
        Color ClT = new Color(TDP[k].getRedVal(), TDP[k].getGreenVal(), TDP[k].getBlueVal());//Va chercher les valeurs de la couleur de fond.
        Color Cfd = new Color (C1.getRougeP(), C1.getVertP(), C1.getBleuP());
        pan.FondPan(Cfd); //Couleur de fond.
     
    if((0<=CoX) && (CoX<=800) && (0<=CoY) && (CoY<=550))//limites de l'écran.
                {pan.TracePt(CoX, CoY, ClT);
                }//ordonne de tracer le point.
    Le Jpanel fait l'objet d'une classe à part, dont voici le code intégral :

    Code java : 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
    class Panneau extends JPanel {
        public void paintComponent(Graphics g)
            {super.paintComponent(g);
            }
     
        public void FondPan(Color Cfd){
            this.Cfd = Cfd;
            setBackground(Cfd);
            }    
     
        public void TracePt(int CoX, int CoY, Color ClT){
            this.ClT = ClT;
            this.CoX = CoX;
            this.CoY = CoY;
            Graphics g = getGraphics();/*Si il n'y est pas, cela génère une exception.*/
            g.setColor(ClT); //Couleur du point.
            g.drawOval (CoX, (550-CoY),1,1);  //réglage du positionnement et de la largeur.
            g.fillOval(CoX, (550-CoY),1,1);
            g.dispose();
            super.paintComponent(g);//n'apporte rien!
            }    
        Color ClT, Cfd;
        int CoX, CoY;    
        Graphics g;    
    }
    Problème classique, les points s'affichent, mais ne résistent pas au redimensionnement des fenêtres. Mieux, si je change la couleur de fond, celle-ci se met sur le dessin, et je dois relancer la classe TracePlan pour revoir apparaitre le graphisme.

    La méthode repaint, où qu'elle soit placée, efface les points à peine créés. J'ai essayé de tracer depuis TracePlan en rappelant Graphics g dans cette classe, le problème était le même!

    Non, vraiment, je n'arrive pas à trouver. (Je ne pense pas avoir besoin de threads ici, il n'y a pas tant de points à tracer).

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Problème classique ...
    Reponse classique:
    Tout le dessin doit se faire dans paintComponent(). En gros, le dessin fait dans TracePt() doit être fait dans paintComponent().

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    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 909
    Billets dans le blog
    54
    Par défaut
    Et tu ne dois pas appeller getGraphics() ! Tu utilises le Graphics founis en parametre de paintComponent().
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Merci beaucoup, Sanguko et bouye pour vos réponses. Mon problème est que l'action de dessiner doit être impérativement lancée depuis un JMenu (ou un ActionEvent). La classe TracePlan servait à gérer cet actionEvent.

    J'ai essayé de lancer le paintComponent en faisant : pan=new Panneau() comme réponse à l'actionEvent, cela n'a pas marché. En fait, c'est comment transformer un actionEvent() en paintCompoent(), mon problème.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Il faut conserver dans l'actionPerformed la liste des modifications, ou faire les modifications directement dans un structure, que tu reutiliseras ensuite dans paintComponent().
    Pour appeler paintComponent(), il faut que tu appelles la methode repaint() sur ton composant (qui surchage paintComponent()), ou un de ses parents.
    La methode repaint() est asynchrone. Tu postes une demande de redessin (qui sera traité un peu plus tard). Ca permet au systeme de regrouper en une seule plusieurs demandes de redessin.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Merci une nouvelle fois Sanguko pour ta réponse.

    Est-ce que ma classe "TracePlan" est ce genre de structure dont tu parles? Par ailleurs, pour l'instant, à chaque fois que j'ai implémenté repaint(), le dessin s'effaçait à peine créé! (que repaint() soit au début de TracePlan ou de Panneau).

    Est-ce que je peux faire quelquechose comme :
    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
    class TracePlan extends AbstractAction{
    public TracePlan (PlanC C1, ValTransfo[] TDP, int nT, Panneau pan)
            {this.C1 = C1;
            this.TDP = TDP;    //Tableaux de valeurs.
            this.nT = nT;    
            this.pan = pan;    //Le panneau où sera tracé le dessin.
            }
     
        public void actionPerformed (ActionEvent e){
             public void paintComponent(Graphics g)/*j'inclue le paintComponent dans le actionEvent*/
            {super.paintComponent(g);
             //calcul des coordonnées et commandes
             // de type g.drawOval, etc.
           }
    }

    }

    Est-ce que cela marche?

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

Discussions similaires

  1. Effacer mon dessin sur mon JPanel
    Par maxa88 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 01/06/2015, 14h37
  2. update de mon dessin avec evenement
    Par guitariste dans le forum 2D
    Réponses: 6
    Dernier message: 02/05/2008, 13h54
  3. Dessiner et effacer sur l'écran
    Par nick974 dans le forum Débuter
    Réponses: 4
    Dernier message: 31/03/2008, 11h12
  4. Réponses: 2
    Dernier message: 08/02/2007, 20h25
  5. Mon dessin ne s'affiche pas au lancement...
    Par Deedier dans le forum MFC
    Réponses: 6
    Dernier message: 02/05/2005, 16h29

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