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 :

[Swing] mauvais affichage sur JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut [Swing] mauvais affichage sur JPanel
    Bonjour a tous,
    J'ai codé une interface graphique suivant le schéma suivant :
    JGrille : JPanel contenant le graphes d'un signal
    JGraph2D : JPanel contenant une JGrille + legendes
    FenetrePrincipale : JFrame contenant et affichant un tableau de JGraph2D

    Je defini un listener de la souris dans la FenetrePrincipale sur les JGrille de manière a afficher la position du curseur de la souris.
    Mon probleme est que l'affichage se fait correctement lorsque je bouge ma souris mais lorsque cette derniere devient statique, l'affichage disparait!!!

    Je ne vois absolument pas d'ou peux venir ce probleme etant donne qu'avant cette nouvelle implémentation, tout fonctionnait a merveille...

    Merci a tous pour vos réponses!

  2. #2
    Membre régulier Avatar de HebusBreizh
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Points : 82
    Points
    82
    Par défaut
    Différentes interrogations:
    - Qu'existait-il avant cette nouvelle implémentation?
    - Quel type de listener est-ce?
    - Est-ce le seul listener défini sur ces composants?
    No guts, no glory

  3. #3
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Implémentation precedentes :
    ---------------------------------------
    Non existances des composants JGrille et JGraph2D. la méthode paint etait vraiment over-surchargée d'ou mon idée de creer des objets differents...
    La fenetrePrincipale contenait uniquement un tableau de JPanel sur lequels on accrochait les listeners!

    Listeners utilisés :
    -----------------------
    J'implémente les interfaces MouseMotionListener et un MouseListener en surchargeant les methodes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void mouseClicked(MouseEvent e) {}
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
        public void mouseDragged(MouseEvent e) {}
        public void mouseMoved(MouseEvent e) {}

  4. #4
    Membre régulier Avatar de HebusBreizh
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Points : 82
    Points
    82
    Par défaut
    A priori pour le comportement que tu décris, seulement le mouseMoved devrait être utilisé pour afficher les coordonnées de la souris.
    Si les coordonnées s'efface lorsque la souris s'arrête, il faudrait aller voir du côté de la méthode repaint() si jamais tu l'as redéfinie.
    Vérifie que la légende est toujours visible et au premier plan. Peut être qu'un composant (la JGrille peut être) se dessine par dessus, les coordonnées se réécrivent dessus parce que tu bouges la souris, mais dès que tu arrêtes, les coordonnées ne sont pas réécrites.
    No guts, no glory

  5. #5
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    En fait, pour d'autres option je suis obligé de surcharger toutes ces méthodes (zoom, etc...);
    en fait, tu penses que la JGrille est repaint par dessus la legende?
    Je jette un coup d'oeil...

    Je te laisse un bout de code pour que tu comprennes mieux
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public void glisserFFT(int i)
        {
            // On ajoute le listener pour filtrer le signal
            this.graphsFFT[i].getGraphe().addMouseListener(new MouseAdapter()
            {
                // Quand la souris entre dans le panel
                public void mouseEntered(MouseEvent e)
                {
                    setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
                }
     
                // Quand la souris sort du panel
                public void mouseExited(MouseEvent e)
                {
                    repaint();
                    int i = ((JGrille)e.getSource()).getNumVoie();
                    setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    Graphics g = ((JGrille)e.getSource()).getGraphics();
                    g.setColor(Color.white);
                    g.drawLine(donnees.getDonneesFFT(i).getXFreq(),1,donnees.getDonneesFFT(i).getXFreq(),graphsFFT[i].getHGraph()-2);
                    g.setFont(new Font(g.getFont().getFamily(),Font.BOLD,15));
                    g.drawString(donnees.getDonneesFFT(i).getFreqText(),4,20);
     
                }
     
     
            });
     
            this.graphsFFT[i].getGraphe().addMouseMotionListener(new MouseMotionAdapter()
            {
                // Quand la souris bouge
                public void mouseMoved(MouseEvent e)
                {
                    repaint();
                    int i = ((JGrille)e.getSource()).getNumVoie();
                    Graphics g = ((JGrille)e.getSource()).getGraphics();
                    g.setColor(Color.white);
                    g.drawLine(donnees.getDonneesFFT(i).getXFreq(),1,donnees.getDonneesFFT(i).getXFreq(),graphsFFT[i].getHGraph()-2);
                    g.setFont(new Font(g.getFont().getFamily(),Font.BOLD,15));
                    g.drawString(donnees.getDonneesFFT(i).getFreqText(),4,20);
                    DonneesFFT d = donnees.getDonneesFFT(i);
                    d.setXFreq(e.getX());
                    if(d.getXFreq() == 0) d.setXFreq(1);
                    if(d.getXFreq() == graphsFFT[i].getLGraph() - 1) d.setXFreq(graphsFFT[i].getLGraph() - 2);
                    g.setColor(Color.blue);
                    g.drawLine(d.getXFreq(),1,d.getXFreq(),graphsFFT[i].getHGraph()-2);
                    double freq = ((int)(10.0*d.getXFreq()*donnees.getFreqEch()/(2*(graphsFFT[i].getLGraph()-1))))/10.0;
                    d.setFreqText(freq+" Hz");
                    g.setFont(new Font(g.getFont().getFamily(),Font.BOLD,15));
                    g.drawString(d.getFreqText(),4,20);
                    donnees.setDonneesFFT(d,i);
                }
            });
        }
    merci bcp...

  6. #6
    Membre régulier Avatar de HebusBreizh
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Points : 82
    Points
    82
    Par défaut
    Tu peux vérifier que la valeur inscrite dans la légende n'est jamais effacée (avec un ValueChangeListener), ce qui nous avancerait plus dans la piste d'une légende "cachée" plutôt que "effacée".
    No guts, no glory

  7. #7
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    je viens de verifier ce que tu viens de me demander et la legende est cachée à mon avis puisque le texte est OK...

  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
    Ne jamais faire de dessin sur un JPanel en dehors de paintComponent si on veux que ce que l'on dessine s'affiche...
    Ton erreur vient du fait que tu ne respecte cette règle.

    En effet en passant par getGraphics tu dessine bien une fois sur le JPanel, mais au repaint suivant bye bye... (voir même avant...).


    Ce qu'il faut faire dans les listeners c'est de préparer les objets qui devront être dessinés, puis déclencher un repaint. Ce repaint appellera automatiquement la méthode paintComponent
    que tu auras codé pour dessiner les objets préparés.
    ++
    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.

  9. #9
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Qu'entend tu par prepaprer les objets?
    Il s'agit de creer le String, de le passer en parametre dans le JPanel puis de lancer un repaint() ?

  10. #10
    Membre du Club Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Points : 67
    Points
    67
    Par défaut
    bah je pense qu'il voulait dire que dans ta classe principale tu as un vector de String par exemple (pour le préparer tes objects)

    ensuite si le vector est non-vide ou différent de null, tu dessines tes string dans ton paintComponent.

    Ensuite dans ton listener, si tu veux changer les string, tu modifier le vecteur avec un accesseur de ta classe principale et tu fais un rapaint(). De cette manière tu n'appelles pas getGraphics() et tu es sûr que ça restera dessiné

  11. #11
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    D'apres la methode que tu m'as indique, ca fonctionne nickel.
    J'ai cependant un petit probleme :
    Lorsque la souris entre dans le premier panel -> affichage de la legende nickel
    Lorsque la souris quitte le premier panel -> legende disparait nickel
    Lorsque j'entre dans un second JPanel -> La legende s'affiche sur les 2 panels!!! ^pas nickel!
    Merci beaucoup de ton aide et je vais me débrouiller avec ca!
    a plus!

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

Discussions similaires

  1. mauvais affichage sur FIREFOX iso android etc
    Par Invité dans le forum Débuter
    Réponses: 3
    Dernier message: 04/10/2012, 18h13
  2. Réponses: 2
    Dernier message: 19/08/2009, 14h16
  3. Mauvais affichage sur un histogramme
    Par Mloody2000 dans le forum Langage
    Réponses: 5
    Dernier message: 27/08/2008, 19h07
  4. Mauvais affichage sur X-axis
    Par Hanae dans le forum BIRT
    Réponses: 3
    Dernier message: 06/07/2007, 11h13
  5. [Swing]Problème d'affichage sur un JTree
    Par tomca dans le forum Composants
    Réponses: 4
    Dernier message: 19/01/2006, 10h41

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