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 :

Carré gris au milieu du JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut Carré gris au milieu du JPanel
    Bonsoir!!! Je vous demande de l'aide pour un petit problème d'affichage; Je simule dans un JPanel un décor et un avion; à la fin de la simulation (elle se fait cycle après cycle), apparaît un étrange rectangle gris au milieu!! voici mes méthodes:

    paintComponent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected void paintComponent(Graphics g){
      if(zoneGauche!=null){
       try{
        super.paint(g);
        simu.getLaGrille().paint(zoneGauche.getGraphics());
       }
     
       catch(NullPointerException npe){ }
       }
      }
    update:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void update(Graphics g){
      simu.getLaGrille().update(zoneGauche.getGraphics());
     }
    et la méthode de simulation:

    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 simuCompleteGraphique (int nbCycle, SimulationGraphique simu){
     
      if (nbCycle==0){
       System.out.println("Pas de simulation");
       this.repaint();
      }
      else{
       this.paintComponent(zoneGauche.getGraphics());
       for (int i=1; i<=nbCycle; i++){
        simu.getSimu().uncycle();
        temporisation();
        this.update(zoneGauche.getGraphics());
       }
      }
     }
    où zoneGauche est mon Jpanel; quelqu'un a t-il une idée d'où pourrait provenir ce désagrément??
    D'avance merci

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Faudrait pas mettre dans ton void SimuCompleteGraphique à la place de Essai et regarde le résultat
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    N'appelle pas paint*(zoneGauche.getGraphics()) mais surcharge la methode paintComponent() de zoneGauche. Swing est malin et ne demande pas à tous les composants de se redessiner s'il n'en a pas besoin. Du coup, ton composant contenant le code qui appelle zoneGauche.getGraphics() n'est pas exécuté parfois, et ta zoneGauche se redessine en faisant ce qu'elle sait faire : un carré gris.

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    J'ai essayé mais ca ne marche pas.... simu.getLagrille() renvoie un type Canvas pour lequel la méthode paintComponent n'est pas défini!!

    voici mes méthodes pour le type Canvas:
    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
     
    public void affichageDecorDeFond(Graphics g){
     
      Graphics2D comp2D= (Graphics2D)g;
        for(int i=0 ; i < this.hauteurDecor ; i++){
       for(int j=0 ; j < this.longueurDecor ; j++){
     
        this.tableauDeBase[i][j].affichageEcran(comp2D,i,j);
     
       }
      }
     }
     public void affichageAvion(Graphics g){
     
      Graphics2D comp2D= (Graphics2D)g;
      for(int i=0 ; i < this.hauteurCarlingue ; i++){
       for(int j=0 ; j < this.longueurCarlingue ; j++){
     
        this.carlingueAvion[i][j].affichageEcran(comp2D,i,j);
     
       }
      }
     }
     public void paint(Graphics g)
     {
      this.affichageDecorDeFond(g);
      this.affichageAvion(g);
     }
     
     public void update(Graphics g)
     {
      this.affichageAvion(g);
     }
    A moins que je n'ai rien compris....

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    A présent j'ai transformé ma méthode paint du canvas en méthode paintComponent, et j'ai fait de même dans le code précédemment écrit.... Rien à faire, le rectangle gris apparait toujours à l'issu du dernier tour de simulation ......

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Non tu n'as pas compris. Ce n'est pas grille.paint(zoneGauche.getGraphics()) qu'il faut faire. Le problème est dans le getGraphics(). Soi tu déplaces le code de dessin de la grille dans zoneGauche, soit tu mets directement la grille à la place de zoneGauche et tu te débarasses de zoneGauche. Encore une fois, un composant n'a pas une zone de dessin persistante. L'écran doit être rafraîchi et quand cela arrive la méthode paint() du composant est appelée... donc ici zoneGauche.paint(). Le résultat est donc un rectangle gris (un Jpanel est un rectangle gris).

    Au fait, c'est une mauvaise idée de mélanger AWT (classe Canvas) et Swing.

  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Bien, mon problème est d'accéder à ce paintComponent() de la zone gauche..... Ma classe est une extension de JFrame. Je peux appeler sa méthode paint(), mais je dois reconnaître que je ne pige pas tout;

    De plus, tu me deconseilles de mélanger de l'AWT et du SWING... Quel est l'équivalent de Canvas dans le swing alors...

    Merci

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Un JPanel tout simplement

  9. #9
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Ok, j'ai bien changé mon Canvas en JPanel, merci, la simulation fonctionne... sauf cette fichue méthode paintComponent() du JPanel zoneGauche, que j'arrive pas à redéfinir... AU SECOURSSSS

  10. #10
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Au fait, ma JFrame a été créé via Visual Editor d'eclipse... Je suppose donc qu'il faut que je surcharge la méthode paintComponent() à l'intérieur de la méthode qui génère le JPanel zoneGauche... C'est ça??

    Mais comment faire?

  11. #11
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Je ne suis pas sûr d'avoir tout suivi mais j'ai l'impression que tu as des problèmes de conception objet...

    Et là, à part en faisant un topic de milliers et milliers de lignes, on ne peut pas trop t'aider...

    Es-tu sûr de bien comprendre ce que signifie redéfinir une méthode ? Si oui, laisse tomber ma remarque, si non je veux bien te guider un peu

  12. #12
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Non non, pas d'inquiétude, je sais faire pour les méthodes!! Seulement le problème vient du fait que j'utilise le visual editor... Et que redéfinir la méthode paintComponent dans une classe JPanel, ca je pense que ca doit aller...

    Mais dans le cas présent j'ai effectivement redéfini une méthode paintComponent, mais dans une classe JFrame.

    Or par le visual editor, j'ai ajouté mon JPanel zoneGauche, et automatiquement la méthode suivante est créée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private JPanel getZoneGauche() {
      if (zoneGauche == null) {
       zoneGauche = new JPanel();
       zoneGauche.setLocation(0, 0);
       zoneGauche.setSize(1280, 512);
       zoneGauche.setBorder(javax.swing.BorderFactory.createMatteBorder(2,2,0,2,java.awt.Color.black));
     
      }
      return zoneGauche;
     }
    Comme la redéfinition de la méthode paintComponent n'a pas fonctionné tel que je l'ai fait, et que conseil qui m'a été donné est:
    N'appelle pas paint*(zoneGauche.getGraphics()) mais surcharge la methode paintComponent() de zoneGauche
    j'en viens à me demander si il ne faut pas redéfinir une méthode paintComponent() dans le code cité précédemment...
    J'espère que mes explications sont relativement claires..... Je suis un peu nouveau dans le milieu, et j'admets donc volontiers que certaines choses m'échappent....

  13. #13
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Le meilleur moyen est je pense que tu dois définir une classe propre à toi, qui extends JPanel, et dans laquelle tu redéfini la méthode paintComponent.

    Ainsi tu devras modifier ta méthode générée par VE avec la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private TonJPanelQuiExtendsJPanel getZoneGauche() {
      if (zoneGauche == null) {
       zoneGauche = new TonJPanelQuiExtendsJPanel();
       zoneGauche.setLocation(0, 0);
       zoneGauche.setSize(1280, 512);
       zoneGauche.setBorder(javax.swing.BorderFactory.createMatteBorder(2,2,0,2,java.awt.Color.black));
       
      }
      return zoneGauche;
     }

  14. #14
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    J'ai suivi ton conseil, et cela donne:

    classe qui étends JPanel:
    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
     
    public PanelSimulationGraphique(SimulationGraphique simu){
      super();
      this.simu=simu;
     }
     
     public void paintComponent(Graphics g){
      if (this.simu == null){
      }
      else{
       try{    
        super.paintComponent(g);
        this.simu.getLaGrille().paint(g);}
        catch(NullPointerException npe){
     
      }
     
      }
     }
     
     public void update(Graphics g){
      simu.getLaGrille().update(g);
     }
    }
    Modification du code à l'intérieur de la JFrame:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private PanelSimulationGraphique getZoneGauche() {
      if (zoneGauche == null) {
       zoneGauche = new PanelSimulationGraphique(this.simu);
       zoneGauche.setLocation(0, 0);
       zoneGauche.setSize(1280, 512);
       zoneGauche.setBorder(javax.swing.BorderFactory.createMatteBorder(2,2,0,2,java.awt.Color.black));
     
      }
      return zoneGauche;
     }
    et modification du code qui gère le tour par tour:
    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
     
    public void simuCompleteGraphique (int nbCycle, SimulationGraphique simu){
     
      if (nbCycle==0){
       System.out.println("Pas de simulation");
       zoneGauche.repaint();
      }
      else{
       for (int i=1; i<=nbCycle; i++){
        simu.getSimu().uncycle();
        temporisation();
        zoneGauche.repaint();
       }
      }
     }
    le résultat est: aucun affichage.... Lorsque j'utilise le debugger d'eclipse et que je place un breakpoint devant zoneGauche.repaint(), je m'apercois que la méthode repaint() ne s'exécute jamais.. J'ai essayé avec revalidate(), mais même topo, pas d'execution... Encore un ptit qqch qui échappe à mon fragile être,

  15. #15
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par Flophx
    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
    public PanelSimulationGraphique(SimulationGraphique simu){
      super();
      this.simu=simu;
     }
     
     public void paintComponent(Graphics g){
      if (this.simu == null){
      }
      else{
       try{    
        super.paintComponent(g);
        this.simu.getLaGrille().paint(g);}
        catch(NullPointerException npe){
     
      }
         
      }
     }
     
     public void update(Graphics g){
      simu.getLaGrille().update(g);
     }
    }
    je trouve qu'écrire un bloc du genre est louche... Car si tu récupères une null pointer exception, c'est peut etre normal que rien ne s'affiche (ca signifierais que soit simu vaut null, soit le retour de getLaGrille => Il y a quoi dans ton JPanel ???)

  16. #16
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Ce que je ne comprends pas c'est pourquoi la méthode repaint() de la zoneGauche ne s'execute pas!!!

  17. #17
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Toujours sur ce problème, en étudiant de près le debugger, j'ai remarqué qu'au moment où il devrait executer le repaint(), l'erreur suivante apparait au niveau du petit menu qui permet de lancer la simulation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    JMenuItem(AbstractButton).fireActionPerformed(ActionEvent) line: not available
    le code du menu est le suivant:
    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
     
    private JMenuItem getNewSimulation() {
      if (newSimulation == null) {
       newSimulation = new JMenuItem();
       newSimulation.setText("Nouvelle simulation");
       newSimulation.setEnabled(true);
       newSimulation.addActionListener(new java.awt.event.ActionListener() { 
     
        public void actionPerformed(java.awt.event.ActionEvent e) {    
     
         String reponse1 = JOptionPane.showInputDialog("Veuillez entrer le nombre de passagers désirés","5 min et 53 max");
         while((testEntier(reponse1))==false){
          if (reponse1==null){
           break ;
     
     
          }
          else{
           reponse1=JOptionPane.showInputDialog("Veuillez entrer le nombre de passagers désirés","5 min et 53 max"); 
          }
         }
     
         String reponse2 = JOptionPane.showInputDialog("Veuillez entrer le nombre de cycles désirés","500 max");
         while((testEntier(reponse2))==false){
          if (reponse2==null){
           break ;
          }
          else{
           reponse2 = JOptionPane.showInputDialog("Veuillez entrer le nombre de cycles désirés","500 max");
          } 
         }     
     
     
         simu=new SimulationGraphique(reponse1,reponse2);     
         int nbCycle=Integer.parseInt(reponse2);
     
         simuCompleteGraphique(nbCycle, simu);
        }
     
       });
      }
      return newSimulation;
     }
    Vraisemblablement ça empe^che la méthode repaint de se lancer... Quelqu'un a t-il une idée?

  18. #18
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Personne n'a d'idée, vraiment??

  19. #19
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Bon ben, toujours au secours:

    1/ J'ai transformé mon Canvas en JPanel
    2/ voici mon code pour l'affichage de la simulation:
    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
     
    public void simuCompleteGraphique (int nbCycle, SimulationGraphique simu){
     
      if (nbCycle==0){
       System.out.println("Pas de simulation");
       zoneGauche.repaint();
      }
      else{
     
       zoneGauche=simu.getLaGrille();
       jContentPane.add(zoneGauche, null);
       zoneGauche.setVisible(true);
     
       for (int i=1; i<=nbCycle; i++){
        simu.getSimu().uncycle();
        zoneGauche.repaint();
     
     
       }
      }
     }
    Et ca n'affiche toujours rien..... Je me demande vraiment ou ca cloche; Lorsque j'essaie juste d'afficher mon JPanel dans une JFrame, ca se passe bien, mais je ne comprends vraiement pas pourquoi ca ne marche pas... La méthode repaint() ne s'applique pas, et lorsque je force l'affichage avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    simu.getLaGrille().update(simu.getLaGrille().getGraphics();
    ou n'importe quoi d'autre, ca ne fonctionne pas....

Discussions similaires

  1. Rendre le milieu d'une image couleur en gris
    Par nouha_79 dans le forum Images
    Réponses: 2
    Dernier message: 16/11/2007, 20h20
  2. niveau de gris en niveau de couleur
    Par corey_jx dans le forum MFC
    Réponses: 2
    Dernier message: 11/06/2003, 23h36
  3. JPanel et Border
    Par titoine dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2003, 16h58
  4. Tracer un carré de X cm
    Par mdel dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/01/2003, 17h17
  5. Racine carrée
    Par SteelBox dans le forum Mathématiques
    Réponses: 5
    Dernier message: 23/11/2002, 18h15

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