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

Agents de placement/Fenêtres Java Discussion :

[JPanel] Problème de rafraichissement


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut [JPanel] Problème de rafraichissement
    J'ai un panel que j'ai rajouté a ma JScrollPane.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    jsp_miniatures.setViewportView(jpanel_miniatures);
    jpanel_miniatures.setLayout(new BoxLayout(jpanel_miniatures, BoxLayout.Y_AXIS));
    Maintenant mon but est : à chaque fois que je cliques sur mon bouton ajouter image : il rajoute une image sur le jpanel_miniatures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // LE CODE DE MON BOUTON AJOUTER
    JPanel Image jpi = new JPanelImage(url_image);
    jpanel_miniatures_article.add(jpi);
    jsp_miniatures_article.invalidate();

    et voila le code de ma classe JPanelImage:

    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
    55
    56
     
    import javax.swing.JPanel;
    import javax.swing.border.LineBorder;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.lang.Math;
     
    public class JPanelImage extends JPanel{
     
    	String url;
     
    //>>>>>>>CONSTRUCTEUR
    public JPanelImage (String addresse){
    	url = addresse;
    }
     
     
     
     
    //>>>>>>>INIT COMPONENT
    	public void paintComponent(Graphics g){
     
     
    		Image monImage = getToolkit().getImage(url); 
    		monImage = Redimension(monImage);
     
    		g.drawImage(monImage, 0, 0, this);
     
    		super.setBorder(new LineBorder(Color.black, 3));
    		super.setSize(new Dimension(100,100));
    		super.setMaximumSize(new Dimension(100,100));
    		super.setMinimumSize(new Dimension(100,100));
    		super.setPreferredSize(new Dimension(100,100));
     
    	}	
     
     
     
     
     
    //>>>>>>>>>>>>>>>METHODE QUI PERMET DE REDIMENSIONNER L'IMAGE POUR LA FAIRE RENTRER DANS UN PANEL 100,100
    public Image Redimension(Image source){
     
    if(Math.max(source.getWidth(this), source.getHeight(this)) == source.getHeight(this)){source = source.getScaledInstance(-1, 100, Image.SCALE_SMOOTH); 
    }
    else{
    source = source.getScaledInstance(100, -1, Image.SCALE_SMOOTH); 
    }
     
    return source; 
    }
     
     
    }

    Mon problème est que mon image est bien redimensionnée et s'affiche bien dans le panel au moment ou je cliques sur le bouton ajouter. Mais des que je bouge ma souris apres je suis soumis a pleins de bugs graphiques (images qui s'étirent ...). A mon avis il doit me falloir jouer avec les paints et repaints mais je n'y arrive pas.

    Un ptit coup de pouce serait le bienvenue ^^

  2. #2
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    Up. J'ai supprimer ma méthode paintComponent et j'ai créé a la place une méthode Dessine()


    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
    import javax.swing.JPanel;
    import javax.swing.border.LineBorder;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.lang.Math;
     
    public class JPanelImage extends JPanel{
     
    	String url;
     
    //>>>>>>>CONSTRUCTEUR
    	public JPanelImage (String addresse){
    		super(true);
    		url = addresse;
     
    	}
     
     
    //>>>>>>>>>>>>>>>>>>>>>>>>> DESSIN
    public void Dessine(){
    		Image monImage = getToolkit().getImage(url); 
    		monImage = Redimension(monImage);
    		Graphics g = super.getGraphics();
    		if (g == null)System.out.println("Graphics = null");
    		g.drawImage(monImage, 0, 0, this);
     
    		//super.setBorder(new LineBorder(Color.black, 3));
    		super.setSize(new Dimension(100,100));
    		super.setMaximumSize(new Dimension(100,100));
    		super.setMinimumSize(new Dimension(100,100));
    		super.setPreferredSize(new Dimension(100,100));	
     
    }
     
     
    //>>>>>>>>>>>>>>>METHODE QUI PERMET DE REDIMENSIONNER L'IMAGE POUR LA FAIRE RENTRER DANS UN PANLE 100,100
    	public Image Redimension(Image source){
     
    		if(Math.max(source.getWidth(this), source.getHeight(this)) == source.getHeight(this)){
       			source = source.getScaledInstance(-1, 100, Image.SCALE_SMOOTH); 
    		}
    		else{
    			source = source.getScaledInstance(100, -1, Image.SCALE_SMOOTH); 
    		}
     
        	return source; 
    	}
     
     
    }
    Et voila a quoi ressemble mon appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jpi = new JPanelImage(url_image);
    jpanel_miniatures_article.add(jpi);
    jpi.Dessine();

    Plus de bug graphique ... juste que mon panel ne contient pas l'image : il est vide. D'ou ca vient ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    A ta place je ne garderai pas en attribut l'URL de l'image mais l'image elle même que tu redimensionnerai dans le constructeur directement plutot que de faire ca dans paintComponent parce que d'apres ton code elle n'est redimensionnée qu'une seule fois et paintComponent va le faire à chaque fois qu'il va être appelé.

    Et ta méthode redimenssion telle qu'elle est implémentée, est une méthode qui devrait être déclarée static. Mais bon ce n'est pas une erreur en soit.

  4. #4
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    J'ai supprimer ma méthode paintComponent et j'ai créé a la place une méthode Dessine() mais un nouveau pb persiste


    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
    import javax.swing.JPanel;
    import javax.swing.border.LineBorder;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.lang.Math;
     
    public class JPanelImage extends JPanel{
     
    	String url;
     
    //>>>>>>>CONSTRUCTEUR
    	public JPanelImage (String addresse){
    		super(true);
    		url = addresse;
     
    	}
     
     
    //>>>>>>>>>>>>>>>>>>>>>>>>> DESSIN
    public void Dessine(){
    		Image monImage = getToolkit().getImage(url); 
    		monImage = Redimension(monImage);
    		Graphics g = super.getGraphics();
    		if (g == null)System.out.println("Graphics = null");
    		g.drawImage(monImage, 0, 0, this);
     
    		//super.setBorder(new LineBorder(Color.black, 3));
    		super.setSize(new Dimension(100,100));
    		super.setMaximumSize(new Dimension(100,100));
    		super.setMinimumSize(new Dimension(100,100));
    		super.setPreferredSize(new Dimension(100,100));	
     
    }
     
     
    //>>>>>>>>>>>>>>>METHODE QUI PERMET DE REDIMENSIONNER L'IMAGE POUR LA FAIRE RENTRER DANS UN PANLE 100,100
    	public Image Redimension(Image source){
     
    		if(Math.max(source.getWidth(this), source.getHeight(this)) == source.getHeight(this)){
       			source = source.getScaledInstance(-1, 100, Image.SCALE_SMOOTH); 
    		}
    		else{
    			source = source.getScaledInstance(100, -1, Image.SCALE_SMOOTH); 
    		}
     
        	return source; 
    	}
     
     
    }
    Et voila a quoi ressemble mon appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jpi = new JPanelImage(url_image);
    jpanel_miniatures_article.add(jpi);
    jpi.Dessine();

    Plus de bug graphique ... juste que mon panel ne contient pas l'image : il est vide. D'ou ca vient ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Est ce que tu es sur qu'il trouve bien ton image.
    Les problemes de chemin vers les fichiers sont fréquents, vérifie qu'il trouve bien le fichier à l'url que tu lui donne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File f = new File(url);
    System.out.println(f.exists());
    Sinon pourquoi faire un super.getGraphics quand un getGraphics() suffit.

  6. #6
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    Oui j'en suis sur qu'il la trouve j'ai fait des tests ^^. Mon probleme persiste.

    Et pour le getGraphics Bah ca sert a rien effectivement ^^ j'ai viré le super

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Je pense mais je ne suis pas sur que tu dois laisser le tracé de ton image dans la méthode paintComponent, parce qu'il est possible qu'au moment de rappeler la méthode paintComponent il réinitialise tout et redessine tout, et si l'image n'est pas dans cette méthode il ne la dessinera pas.

    ps : le "super" est valable aussi pour les autres méthides (setSize ... ). On utilise super uniquement quand la méthode a été surchargée et que l'on veut faire appelle à la méthode de la classe mère.

  8. #8
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    Mais j'ai supprimé ma méthode paintComponent. Comment le tracé pourrait subsister ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    tu n as pas supprimé paintComponent. Tu as juste supprimer ta redéfinition de la méthode. cette méthode est appelé très souvent (redimenssionement de la fenetre ... ) et le fait de la surcharger permet de dessiner des éléments suplémentaire sur ton composant (ici un image).

  10. #10
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    Vi je sais bien que j'ai pas supprimé ma méthode paintComponent mais seulment sa redéfinition. J'ai pas compris le : " tu dois laisser le tracé de ton image dans la méthode paintComponent"

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Là tu dessine ton image avec la méthode Dessine() que tu n'appelle qu'une fois lors de l'initialisation de ton JPanel. Donc dès que paintComponent sera appelé, il ne redessinera pas ton image. Il dessinera ton composant normalement sans l'image.

    Il faut que tu surcharge la méthode paintComponent en mettant ton g.drawImage(...) dedans. Mais évite de mettre le Redimension dedans. Tu peux t'en sortir en initialisant l'image dans ton constructeur et tu garde l'image comme attribut de ta classe plutot que son URL qui ne te sert à rien.

    Et ensuite dans paintComponent tu as juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image,0,0,this);
    }

  12. #12
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    C'etait logique en plus ^^
    Merci mon barbu !

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

Discussions similaires

  1. Problème de rafraichissement d'un JPanel
    Par Crues dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 28/11/2011, 18h29
  2. Réponses: 2
    Dernier message: 13/09/2011, 11h59
  3. Réponses: 4
    Dernier message: 11/05/2010, 12h20
  4. [JTree]problème de rafraichissement
    Par peppena dans le forum Composants
    Réponses: 9
    Dernier message: 20/01/2004, 14h06
  5. Toujours un problème de rafraichissement de DBGrid
    Par tripper.dim dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 13h15

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