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 :

Rafraichissement JPanel


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Points : 4
    Points
    4
    Par défaut Rafraichissement JPanel
    Bonjour a tous,

    Etant donné que ce post est mon premier je me présente, je suis novice en Java, et je dois faire une interface graphique pour un programme de reconnaissance de forme. J'ai deja une interface qui tient a peu pres la route, mais j'ai quand meme un probleme lors du rafraichissement de mon image. En effet des que je redimensionne ma fenetre celle-ci disparait.

    Rien d'etonnant me direz vous, car j'ai fait quelques recherches et j'ai pu voir qu'il fallait utiliser un buffer pour l'image, ou bien simplement utiliser la méthode paintComponent(), qui fonctionnera de pair avec les fonctiosn update() et repaint().

    Mais je n'arrive pas intégrer ceci à mon code

    J'ai regardé ce post qui était en rapport avec le mien, mais je n'ai pas eu de résultat probant.

    http://www.developpez.net/forums/viewtopic.php?t=464677

    Voici mon code :

    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
     
    public class EcouteClic extends MouseAdapter {
    	private JPanel pan ;
    	int x=0, y=0 ;
    	public static boolean dessine = false ;
     
    	public EcouteClic(JPanel panel) {
    		this.pan = panel ;
    		panel.addMouseListener(new java.awt.event.MouseAdapter() {
    			public void mousePressed(java.awt.event.MouseEvent e) {
    				dessine = true ;
    				x = e.getX(); y = e.getY();
    			}
    		});
    		panel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
    			public void mouseDragged(java.awt.event.MouseEvent e) {
     
    				Graphics2D g2d = (Graphics2D)pan.getGraphics();
    				if(Fenetre.toggle.isSelected())
    					g2d.setColor(Color.white) ;
    		        /** Défini une épaisseur de 5 pixels */
    				g2d.setStroke(new BasicStroke(10f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
    				g2d.drawLine(x, y, e.getX(), e.getY());
    		        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
     
    		        x = e.getX(); y = e.getY();
    		    }
    		});
    	}
     
    }
    et je l'appelle comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Fenetre extends JFrame {
    private JPanel panel ;
    ...
     
    panel.addMouseListener(new EcouteClic(panel)) ;
    ...
    }
    Je vous passe bien entendu les détails peu important pour mon probleme. Auriez vous un conseil pour que j'arrive a un résultat fonctionnel ?

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    Tu dessines ton image lorsqu'il y a un drag de la souris, je ne comprends pas trop.
    Donc je vais te donner un élément de réponse qui va peut etre t'éclairer mais je ne suis pas sur que ca marche à cause des coordonnées

    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
    public class EcouteClic extends MouseAdapter { 
       private JPanel pan ; 
       int x=0, y=0 ; 
       public static boolean dessine = false ; 
     
       public EcouteClic(JPanel panel) { 
          this.pan = panel ; 
          panel.addMouseListener(new java.awt.event.MouseAdapter() { 
             public void mousePressed(java.awt.event.MouseEvent e) { 
                dessine = true ; 
                x = e.getX(); y = e.getY(); 
             } 
          }); 
          panel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
             public void mouseDragged(java.awt.event.MouseEvent e) { 
                     x = e.getX(); y = e.getY();
                     panel.revalidate();
                     panel.repaint();
              } 
          }); 
     
          private void paintComponent() {
              Graphics2D g2d = (Graphics2D)pan.getGraphics(); 
                if(Fenetre.toggle.isSelected()) 
                   g2d.setColor(Color.white) ; 
                  /** Défini une épaisseur de 5 pixels */ 
                g2d.setStroke(new BasicStroke(10f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
                g2d.drawLine(x, y, e.getX(), e.getY()); 
                  g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
     
          }
     
     
       } 
     
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    je viens d'essayer d'adapter ce code que tu m'as donné pour qu'il marche, mais rien n'y fait. j'ai sauvegardé les coordonnées du drag dans des variables de classe, et dans paintComponent j'ai remplacé e.getX() et e.getY() par ces variables. Mais rien ne se dessine dans mon JPanel.

    Pour t'éclairer, le but de cette interface est de pouvoir dessiner à main levée dans un JPanel. Je devrais ensuite récupérer ce JPanel en bmp (mais ca je pense que si je m'en sort avec ma fonction paintComponent je n'aurais aucun probleme).

    Je vais continuer mes recherches. Merci pour ton aide.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Evidemment que cela ne marche pas, la methode paintComponent() n'a pas ete "overriden" mais "overloaded". Bref, au lieu d'ecrire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          private void paintComponent() {
              Graphics2D g2d = (Graphics2D)pan.getGraphics();
    Ecris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          protected void paintComponent(Graphics g) {
              Graphics2D g2d = (Graphics2D) g;
    P.S : l'appel a revalidate() ne sert a rien.
    Romain Guy
    Android - Mon livre - Mon blog

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Je crois n'avori pas encore saisi correctement le fonctionnement du paintComponent.

    J'ai intégré le code que tu m'as donné Gfx, mais je ne peux toujours pas dessiner dans mon JPanel, alors que dans la toute premiere version je pouvais (meme si je perdais totu au moindre redimensionnement).

    Mon code est désormais :

    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
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
     
    import javax.swing.*;
     
    public class EcouteClic extends MouseAdapter {
    	private JPanel pan ;
    	int x=0, y=0, dragx=0, dragy=0 ;
     
    	public EcouteClic(JPanel panel) {
    		this.pan = panel ;
    	      panel.addMouseListener(new java.awt.event.MouseAdapter() {
    	         public void mousePressed(java.awt.event.MouseEvent e) {
    	            x = e.getX(); y = e.getY();
    	         }
    	      });
    	      panel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
    	         public void mouseDragged(java.awt.event.MouseEvent e) {
    	                 //x = e.getX(); y = e.getY();
    	        	 	dragx = e.getX(); dragy = e.getY();
    	                pan.repaint();
    	          }
    	      });
    	}
     
    	      protected void paintComponent(Graphics g) {
    	          Graphics2D g2d = (Graphics2D) g;
    	            if(Fenetre.toggle.isSelected())
    	               g2d.setColor(Color.white) ;
    	              /** Défini une épaisseur de 5 pixels */
    	            g2d.setStroke(new BasicStroke(10f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
    	            g2d.drawLine(x, y, dragx, dragy);
    	              g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
     
    	      }
    }
    L'appel restant le meme dans l'autre classe.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Ah pardon j'avais pas vu que ta classe n'herite d'aucun composant !
    Voila le code :

    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
     
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
     
    import javax.swing.*;
     
    public class EcouteClic extends JPanel {
       int x=0, y=0, dragx=0, dragy=0 ;
     
       public EcouteClic() {
             addMouseListener(new java.awt.event.MouseAdapter() {
                public void mousePressed(java.awt.event.MouseEvent e) {
                   x = e.getX(); y = e.getY();
                }
             });
             panel.addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseDragged(java.awt.event.MouseEvent e) {
                        //x = e.getX(); y = e.getY();
                      dragx = e.getX(); dragy = e.getY();
                       repaint();
                 }
             });
       }
     
             protected void paintComponent(Graphics g) {
                 Graphics2D g2d = (Graphics2D) g;
                   if(Fenetre.toggle.isSelected())
                      g2d.setColor(Color.white);
                   g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                   g2d.setStroke(new BasicStroke(10f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
                   g2d.drawLine(x, y, dragx, dragy);
             }
    }
    Maintenant remplace le JPanel que tu passais a cette classe par la classe elle-meme. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maFrame.add(new EcouteClic());
    Romain Guy
    Android - Mon livre - Mon blog

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Merci pour toutes ces explications, je m'y mets tout de suite

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Bon alors j'ai appliqué à la lettre tes recommandations, je pense avoir fait comme il fallait et je pense avoir beaucoup mieux compris le fonctionnement de paintComponent().

    j'ai mis des affichages pour voir si mes methodes mousePressed et mouseDragged marchent, et j'ai pas l'impression de m'en serveir, je ne comprend pas :

    Pourtant dans la logique tout me parait bon.

    Voici mon code :

    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
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
     
    import javax.swing.*;
     
    public class EcouteClic extends JPanel {
    	int x=0, y=0, dragx=0, dragy=0 ;
    	public static boolean dessine = false ;
     
    	public EcouteClic() {
    	      addMouseListener(new java.awt.event.MouseAdapter() {
    	         public void mousePressed(java.awt.event.MouseEvent e) {
    	            dessine = true ;
    	            System.out.println("mousePressed") ;
    	            x = e.getX(); y = e.getY();
     
    	         }
    	      });
    	      addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
    	         public void mouseDragged(java.awt.event.MouseEvent e) {
    	                //x = e.getX(); y = e.getY();
    	                System.out.println("mouseDragged") ;
    	        	 	dragx = e.getX(); dragy = e.getY();
    	                repaint();
    	          }
    	      });
    	}
     
    	      protected void paintComponent(Graphics g) {
    	          Graphics2D g2d = (Graphics2D) g;
    	            if(Fenetre.toggle.isSelected())
    	               g2d.setColor(Color.white) ;
    	              /** Défini une épaisseur de 5 pixels */
    	            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    	            g2d.setStroke(new BasicStroke(10f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
    	            g2d.drawLine(x, y, dragx, dragy);
     
     
    	      }
    }
    L'appel etant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    panel.add(new EcouteClic()) ;
    panel etant un JPanel

    EDIT : il y a bien une zone ou on peut dessiner, mais celle ci est minuscule, mon JPanel est de 128x128, et la c'est a peine sur 5 pixels. Et une fois encore je colle completement, j'ai fait plein de tests, mais je ne vois pas d'ou ca peut venir ...

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Deja il manque un repaint() a la fin de mousePressed(). Ensuite pour la taille, ca vient de ta JFrame. Tu dois avoir un probleme de layout. Si tu veux donner a ton panneau de dessin une taille par defaut tu peux rajouter ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Override
    public Dimension getPreferredSize() {
      return new Dimension(128, 128);
    }
    Romain Guy
    Android - Mon livre - Mon blog

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Ok merci beaucoup, désormais j'ai un résultat. Ca y est je peux dessiner dans mon panel, mais j'ai comme qui dirait un bug d'affichage c'est a dire que quand je clique sur le bouton de la souris pour dessiner, j'ai l'image du dernier élément de la fenetre sur lequel j'ai passé mon curseur qui s'affiche dans le panel. Je pense que j'arriverai a régler ce problème apres qq petits tests, je vais pas abuser de votre aide.

    Merci a toi Gfx pour toute cette aide, d'ici demain j'aurai qq choses qui marche. Sachant que j'ai tout le temps que je veux pour faire cette appli, mais que j'aime bien réussir a faire les choses bien et vite. Mais pour ça je vais attendre d'avoir des bases plus solides en Java

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Ah heu oui c'est normal ce bug. Dans ton paintComponent() tu ne dessines pas de fond au composant, il est donc transparent. Si un composant est transparent, il faut le preciser a Swing. Tu as deux solutions: soit tu ajoutes setOpaque(false) dans le constructeur de EcouteClic, soit tu rajoutes quelque chose comme cela dans paintComponent() (juste apres Graphics2D ....) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Rectangle clip = g2d.getClipBounds();
    g2d.setColor(getBackground());
    g2d.fillRect(clip.x, clip.y, clip.width, clip.height);
    Romain Guy
    Android - Mon livre - Mon blog

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup gfx, ca me semble parfait, me reste juste a enregistrer le bmp de ce panel maitenant

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

Discussions similaires

  1. rafraichissement jpanel apres changement de label
    Par BigBarbare dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 28/03/2008, 16h17
  2. Rafraichissement JPanel trop lent
    Par Risike dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 24/07/2007, 17h23
  3. [JPanel] quel méthode appelé lors du rafraichissement...
    Par lilou77 dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 01/11/2005, 15h08
  4. [JPanel] Problème de rafraichissement
    Par n00bi dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 04/07/2005, 17h42
  5. [JPanel] Forcer le rafraichissement d'un sous panel
    Par tomca dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 18/05/2005, 16h49

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