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 :

Raffraichissement graphique 1fois/2


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut Raffraichissement graphique 1fois/2
    Bonjour à tous.

    Mon problème est le suivant :
    j'ai une JFrame, dans laquelle je met en ouest un JTree et au centre, un JPanel sans LayoutManager dans lequel je dessine des lignes selon l'objet selectionné dans le JTree.

    J'ai donc surchargé mon JPanel comme suit :
    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
        class panelGraphique extends JPanel {
            int scaleX, scaleY;
            Object[] os;
            public panelGraphique () {
                super(null);
                setBackground(Color.CYAN);
                os = new Object[0];
            }
            
            public void setObjects(Object[] o) {os = o;}
            
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                System.out.println("Dans paintComponent");
                // Dessin dans le panel selon os..
            }
        }
    Pour réagir à la sélection d'un noeud dans mon JTree, je surcharge la méthode valueChanged() :
    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
        public void valueChanged(TreeSelectionEvent e) {
            
            courant = (DefaultMutableTreeNode) Jarbre.getLastSelectedPathComponent();
            
            if (courant == null) return;
    
            Object [] o = courant.getUserObjectPath();
            
            for (int i=0; i<o.length; i++) System.out.print(o[i].toString());
                
            paneGraph.setObjects(o);
    
            validate();
            repaint();
            
        }
    Dans valueChanged(), le System.out.println() affiche les bons objets, que je passe ensuite à mon JPanel personalisé.
    Le problème, c'est que le paintComponent() de mon panel n'est appelé qu'une fois sur 2 quand je clique sur les noeuds de mon JTree (je le vois grâce au System.out.println dans paintComponent() ).
    J'ai tenté de forcer un raffraichissement complet de ma JFrame à chaque fois, mais j'ai pas trouvé la bonne méthode... Même en faisant un appel explicite de paneGraph.repaint()...

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

  2. #2
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut
    tu as essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void setObjects(Object[] o) {
    os = o;
    this.repaint();
    }
    ?

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    J'avais déjà tenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    paneGraph.setObjects(o);
    paneGraph.repaint();
    J'ai quand même testé ta suggestion à tout hazard, mais ça ne donne rien

    J'ai tenté de mettre des invalidate(), validate(), revalidate() (je ne sais pas exactement comment ces méthodes fonctionnent...) pour le paneGraph et ma JFrame, mais ça ne change rien.

    Peut-être qu'un update() serait plus approprié...
    J'avoue que je comprends pas vraiment les différences entre toutes les méthodes de raffraîchissement.

    J'ai vu dans le forum qu'il fallait faire attention au double buffering, ça pourrait être dû à ça ?

  4. #4
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut
    j'ai trouvé ça :
    In general, any changes to a containers component hierarchy, such as adding/removing components, changing the size of components and changing borders, requires that the container be validated, ie, we need to ask its layout manager to do a new layout. The AWT method for this is validate. The JComponent method for this (in Swing) is revalidate.

    We use the repaint method whenever a components rendering needs to be changed. This is for changes like component colors and text on labels (as long as the new text doesn't change the label size enough to require validation).

    In making changes to a gui we often need to both validate a layout and ask one or more components to repaint themselves. Looking at stack traces or touring through the source code will reveal that a lot is going on behind the scenes. So it seems reasonable that we may not always be able to predict with certainty which methods we need to use to update guis after changes. Experimenting with validation and/or repainting usually seems to lead to good results.
    qui n'est certes pas une explication à ton problème, mais qui peut tenter la déconfusion sur les termes

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut


    Au moins, je vois que ma confusion est partagée sur l'utilisation de ces méthodes... Rien n'est dit sur le invalidate() ?

    En tout cas, je viens de voir que le repaint() de mon JPanel n'appelle pas systématiquement le paintComponent().

    En tout cas, merci pour ta contribution

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    Bon, ben en désespoir de cause, je recréé un nouveau JPanel à chaque selection de noeud dans mon JTree...

    C'est pas très élégant, mais bon, au moins, à chaque fois (enfin, presque ) la méthode paintComponent() est appelée.

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

Discussions similaires

  1. Formalisation graphique des algorithmes
    Par David R. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/12/2012, 10h21
  2. Réponses: 3
    Dernier message: 09/02/2003, 01h09
  3. [RAVE][DELPHI7] Comment faire un graphique ?
    Par DFANDOR dans le forum Rave
    Réponses: 7
    Dernier message: 06/02/2003, 20h25
  4. Réponses: 10
    Dernier message: 27/08/2002, 23h24
  5. Probleme de raffraichissement
    Par gimlithedwarf dans le forum Composants VCL
    Réponses: 5
    Dernier message: 12/08/2002, 06h31

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