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 :

Problème d'affichage dans une zone de "dessin"


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 51
    Points
    51
    Par défaut Problème d'affichage dans une zone de "dessin"
    Salut à tous!

    Voila j'ai un petit problème et j'espère que certains d'entre vous pourront m'aider.

    J'ai fait une fenêtre (de type Frame) dans laquelle j'ai deux JPanel : un dans la zone CENTER et l'autre dans la zone EAST.
    Le panel de la zone CENTER sert en fait de zone de "dessin" dans laquelle je visualise des une repère avec des axes et des droites, rectangles etc... dans ce repère.
    Dans le panel de la zone EAST, j'ai des contrôle swing qui sont en fait les paramètres de mon repère. C'est à dire que si je modifie un paramètre, mon repère doit se redessiner automatiquement en fonction des modifications.

    Mon repère se redessine automatiquement, cela ne pose pas de problème.
    Mon problème en fait, c'est que lorsqu'il se "redessine", j'ai des affichages encore présent de l'ancien repère qui aurait normalement du totalement disparaître (je ne sais pas si j'arrive à bien me faire comprendre mais ce n'est pas facile à expliquer...). Ces affichages persistent disparaissent lorsque j'ouvre une autre fenêtre (en gros je regarde ma fenêtre avec mon repère et mes rectangles etc..., je la minimise pour regarder autre chose (par exemple une page internet avec le forum de developpez.com!) et lorsque je reviens sur ma fenêtre, les affichages persistents ont comme été "gommé" et mon nouveau repère est parfaitement dessiné).
    Je ne sais pas si je me suis bien fait comprendre.

    Ma question est donc de savoir si il y a un moyen de ne plus avoir du tout ces affichages? Que lorsque je redessine mon repère, j'ai automatique ce que je desire sans etre obligé de passer à une autre fenêtre etc...

    Pour info, après les modifications, je fais bien appel à la fonction repaint() qui me redessine automatiquement tout ce que je veux.

    Je n'ai pas encore trouvé autre chose qui pourrait faire ce que je veux.... Est-ce que quelqu'un a une idée?

    Merci d'avance!

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je crains que pour qu'on puisse mieux comprendre la source de ton probleme, il ne te faille nous montrer ton code.
    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

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 51
    Points
    51
    Par défaut
    OK.
    Donc j'ai une première classe qui s'appelle VisualisationXtree. Dans cette classe, je récupère tous les objets qui devront être dessiné.
    J'ai mis une fonction dessine () que j'appelle lorsque je veux "dessiner" une première fois mes données.
    J'ai également des fonctions de mise à jour de mes paramètres.

    J'ai une deuxième classe qui s'appelle JCanvas qui elle est la classe permettant de dessiner (avec la fonction paint).

    PS : j'ai raccourci le code en enlevant tout ce qui n'était pas interessant pour comprendre mon problème (trop long sinon). Il est donc possible qu'il y ait quelques erreurs de syntaxe ou de variables non déclarés dans le code qui suit (mais si je ne l'ai pas mis c'est qu'il est inutil pour comprendre).

    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
     
    public class VisualisationXtree {
        private JCanvas jc;
     
        public void dessine ()
        {
            this.jc.setBackground(Color.WHITE);
            this.jc.setPreferredSize(new Dimension(this.widthArea,this.heightArea));
     
            // GUIHelper : classe qui me permet simplement d'afficher mon panel jc
            // Dans cette fonction je fais juste :
            // JFrame frame = new JFrame();
            // frame.getContentPane().add(jc, java.awt.BorderLayout.CENTER);
            GUIHelper f = new GUIHelper (this.nomDossier, this);
            f.showOnFrame(this.jc,"Visualisation des rectangles ");
     
            this.getAllRectangle();
        }
     
        public void addData (Data dt)
        {
            // Ajout de la donnée à une structure de données
            // Calcul du rectangle --> on récupère une donnée rect de type RectangleDrawable
            RectangleDrawable rect = makeRectangle (dt);
            jc.clear();
            this.getAllRectangle(rect);
            jc.repaint();
        }
     
        public void getAllRectangles ()
        {
            for (int i=0; i<nbRectangle; i++)
            {
                 // x, y, width et height calculé ici --> paramètres du rectangles
                 // Je ne mets pas le code car trop long
                 // makeRectangle --> fonction qui retourne un object RectangleDrawable (classe que j'ai écrite)
                 RectangleDrawable rect = this.makeRectangle (x, y, width, height);
                 jc.addDrawable rectangle();
             }
        }
    }
    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
     
    class JCanvas extends JPanel {
        public List drawables = new LinkedList();
     
        public void paint(Graphics g) 
        {
            // On dessine quelque chose uniquement si il y a
            // des rectangles!
            if (drawables.size() > 0)
            {
                for (Iterator iter = drawables.iterator(); iter.hasNext();) 
                {
                    RectangleDrawable drawable d = (IDrawable) iter.next();
                    d.draw(g);
                }
            }
        }
        public void addDrawable(IDrawable d) 
        {
            drawables.add(d);
            repaint();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class RectangleDrawable extends FormDrawable{
     
        public void draw(Graphics g) 
        {
            Color c = g.getColor();
            g.setColor(color);
            g.drawRect(rect.x+marge,rect.y+marge,rect.height,rect.width);
            //g.fillRect(rect.x,rect.y,rect.height,rect.width);
            g.setColor(c);
        }
    }
    Donc lorsque j'appelle la première fois la fonction dessine(), je n'ai aucun souci.
    Ensuite, lorsque j'appelle la fonction addData de la classe VisualisationXtree, mon rectangle se dessine bien, mais j'ai des affichages byzarres à l'écran (par exemple, des affichages du dessin précédent qui ne devrait plus etre la). Lorsque je change de fenêtre et que je reviens à mon dessin, ces affichages ont disparu.

    Bref je ne comprends absolument pas.

    Si quelqu'un a une idée...

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    il faut que tu surcharges la méthode paintComponent(Graphics g) de ton JPanel et non paint(Graphics g)
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 51
    Points
    51
    Par défaut
    Si je comprends bien,
    Je remplace la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void paint (Graphics g)
    {
        // Code
    }
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void paintComponent (Graphics g)
    {
        // Meme code que pour paint (Graphics g)
    }
    Et là ou je faisais repaint (), je laisse pareil ? Ou il faut que j'appelle une autre méthode ?

    Et merci pour ton aide

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 51
    Points
    51
    Par défaut
    Aahhh c'est bon ca marche!!
    Encore merci pour ton aide!!

    Donc pour donner une petite explication à ceux qui auraient un jour ce problème :

    j'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void paint (Graphics g)
    {
        // Code
    }
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected void paintComponent (Graphics g)
    {
        super.paintComponent(g);
        // Meme code que pour paint (Graphics g)
    }
    Voila! Et merci au forum !!

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    ça fait quoi le "protected" à la place de "public" ? c'est quoi la différence?
    Merci!!

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    celà veut dire que la méthode ne peut être appelée ou redéfinie depuis une classe n'héritant pas de la tienne
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/10/2009, 10h12
  2. Problème d'affichage dans une zone de liste
    Par wood_phil dans le forum IHM
    Réponses: 1
    Dernier message: 26/09/2008, 00h25
  3. Problème de lien dans une zone de texte
    Par linkman dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 29/07/2006, 22h17
  4. Affichage dans une zone de texte.
    Par YLL dans le forum Access
    Réponses: 5
    Dernier message: 20/02/2006, 16h37

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