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

Interfaces Graphiques en Java Discussion :

Probleme de rafraichissement d'un panel de plusieurs compo.


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut Probleme de rafraichissement d'un panel de plusieurs compo.
    Bonjour,
    Certains reconnaitrons le début du post. j'ai un panel contenant plusieurs composants graphiques.
    J'ai la possibilité de les déplacer.
    Pour cette exemple on va dire que j'ai 2 composants : A un gros, et B un petit.
    si je déplace B sans passer sur A tout va bien. si je passe B sur A, mais sans que B soit totalement dans A, mon image scintille, c'est un probleme, mais ce n'est pas le sujet, par contre si je met completement mon image B sur A (je suis toujours en déplacement - dragged) alors là, c'est la catastrophe, mon image de B ne correspond plus à elle meme mais correspond a une partie de l'image de A....

    en image cela donne :
    au départ.


    superposition partielle :


    superposition totale :


    je vous joins aussi le code qui met à jours le panel...

    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
     
      /**
       * Rafraîchit les composants ajoutés au DesignPanel.
       * 
       * Un tri est effectué pour qu'apparaissent en premier plan les formes spéciales.
       **/
     
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int count = getComponentCount();
        Component[] pacComponents = new Component[count];
        Component[] specialForms = new Component[count];
        Component[] other = new Component[count];
        int j = 0;
        int k = 0;
        int l = 0;
        for (int i = 0; i < count; i++) {
          Component component = getComponent(i);
          if (component instanceof PacComponent) {
            pacComponents[j] = component;
            j++;
          } else if (component instanceof SpecialForm) {
            specialForms[k] = component;
            k++;
          } else {
            other[l] = component;
            l++;
          }
        }
        // On commence par dessiner les others.
        for (int m = 0; m < l; m++) {
          //other[m].repaint();
          other[m].paint(g);
        }
        // Ensuite on dessine les pacComponents.
        for (int m = 0; m < j; m++) {
          pacComponents[m].repaint();
        }
        // EnFin, dessine les formes spéciales.
        for (int m = 0; m < k; m++) {
          specialForms[m].paint(g);
        }
      }
    moi mes composants sont des PacComponent....
    si qq'un voit d'ou vient l'erreur...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    en voyant mon code, j'ai vu q j'avais bizarrement fait un repaint() pour mon composant alors que pour les autres je faisait un paint(g)...,
    j'ai alors mis un paint(g) pour me rappeler pourquoi je ne l'avais pas mis, et bizarrement je n'ai plus cette effet de scintillement lors que je passe sur un autre composant, par contre j'ai des choses vraiment bizarre au niveau de l'affichage....
    je vais essayer de comprendre...
    déjà quel est la différence entre paint(graphics) et repaint() ?

  3. #3
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    paint() lance le dessin du composant, repaint() efface d'abord l'ecran puis lance l'appel a paint(). C'est en gros ca. Tes effets bizarres doivent venir de zones transparentes dans tes composants. Si tu ne rempli pas tous les pixels (d'apres tes screenshots c'est le cas), il FAUT faire un setOpaque(false) sur tes composants.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    j'ai oublier de préciser que j'ai aussi surcharger la méthode paintChildren en la laissant vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      protected void paintChildren(Graphics g) {
        // volontairement vide.
      }
    et que suivant si j'enleve cette méthode ou non, le résultat n'est pas le meme.
    en la laissant :
    au début, à l'ouverture voila le résultat, c'est a peut prêt ce qui est voulure, sauf que l'image est moche dans le coin haut à gauche, on dirait qu'il y a deux composants identique.

    ensuite si je ne fait rien, juste je clike sur une autre fenetre (rien a voir avec l'application) et qu'ensuite je reviens sur la fenetre de mon appli, donc un rafraichissement est effectuer : voila ce que j'obtiens :

    mon composant a disparu, et j'ai toujours la bavure en haut à gauche, ausi pour debuger, j'ai demandé un affichage dans le monitor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        // Ensuite on dessine les pacComponents.
        for (int m = 0; m < j; m++) {
          //pacComponents[m].repaint();
          pacComponents[m].paint(g);
          Rectangle r = pacComponents[m].getBounds();
          System.out.println("DesignPanel, refreshComponents(Graphics g) : pacComponent "+pacComponents[m].getClass().getName()+" => x:"+r.x+", y:"+r.y);
        }
    et le résultat est :

    DesignPanel pacComponent AcquisitionGrid => x:5, y:345
    DesignPanel pacComponent Graph => x:5, y:5

    donc a priori le composant qui a disparu devrai etre comme sur l'image 1., mais il n'apparait pas bizarrement.
    J'ai donc ensuite décidé le composant qui restait visible, et voila le résultat :

    il apparait que mon composant etait caché derrière... je ne comprends vraiment rien...
    sur tout que mon affichage dans le monitor m'indique bien qu'il devrait etre a sa position initiale.

    bref maintenant si je met en commentaire le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //  protected void paintChildren(Graphics g) {
        // volontairement vide.
    //  }
    voila la premiere image lors de l'initialisation :

    c'est un peu plus propre..., ensuite apres un rafraichissement, on garde cette meme image.
    et si de decide de la deplacer, on découvre en dessous des choses, mais le deplacement s'effectue mal, l'image est décalé par rapport a la souris, et on dirais que l'image est contenu dans un panel, qui se deplace lui a l'allure de la souris, et donc mon image se deplacant plus vite que le panel, en sort et est tronqué... bizarre, tout ca sans rien changer à ma méthode de déplacement lol, je vais devenir folle.

    donc voila si quelqu'un peut m'"expliquer en quoi cette méthode paintChildren peut créer de tel bouleversement...

  5. #5
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Tu ajoutes tes composants comme des enfants de ton panel (avec la methode add()) ? Si oui, laisse paintChildren() et ne lance pas le dessin des enfants toi meme.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    effectivement j'ajoute mes composants en faisant un add(), donc j'ai enlever le lancement du dessin des enfants, et j'ai aussi enlevé la méthode PaintChildren à vide, de cette manière cela a l'air de beaucoup mieux fonctionner.
    j'ai toujours le probleme lors du déplacement de mon image, l'image bouge plus vite que le panneaux qui la contient. ja vais le gérer...
    et voila

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

Discussions similaires

  1. [Image] Probleme de rafraichissement
    Par leyee dans le forum 2D
    Réponses: 4
    Dernier message: 31/10/2005, 22h26
  2. Probleme de rafraichissement Fenetre Win32 ...
    Par miaw dans le forum OpenGL
    Réponses: 1
    Dernier message: 09/05/2005, 08h59
  3. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  4. Probleme de rafraichissement
    Par glRaZ dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/03/2004, 14h07
  5. [MFC] probleme de rafraichissement d'une image
    Par Vestaproman dans le forum MFC
    Réponses: 6
    Dernier message: 09/01/2004, 23h59

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