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 :

Repaint et Rafraichissement


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut Repaint et Rafraichissement
    Bonjour,

    J'ai un problème lors du repaint() d'un JPanel. Normalement, il me semble que si on ne redéfinit pas la méthode update(), le JPanel se raffraichit à chaque appel de la méthode repaint().

    Le problème c'est que dans mon cas, le JPanel ne se raffraichit pas, alors que je fais bien appel a repaint() et que je n'ai pas redéfinis update().

    Voici le code de ma méthode paint à titre indicatif:

    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 paint(Graphics g){
    		if(this.liste != null){
    			Collection<PositionSourisInt> collect = this.liste.values();
    			for (Iterator<PositionSourisInt> it = collect.iterator(); it.hasNext();){
    				PositionSourisInt pos = it.next();
    				try{
    					g.drawImage(this.img,pos.getX(),pos.getY(),this);
    				}
    				catch(RemoteException re){
    					System.out.println("Error");
    					re.printStackTrace();
    				}
    			}
    		}
    	}
    Merci à ceux qui pourront m'aider

  2. #2
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Par défaut
    Sans être un expert je tenterai de redéfinir:

    paintComponent(graphics g)

    sans oublier d'appeler super.paintComponent(graphics g) dans ta méthode.


    J'ai quaisiement le même exemple chez moi et ça fonctionne avec repaint

    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
     
    public void paintComponent(Graphics g){
                   super.paintComponent(g);
    		if(this.liste != null){
    			Collection<PositionSourisInt> collect = this.liste.values();
    			for (Iterator<PositionSourisInt> it = collect.iterator(); it.hasNext();){
    				PositionSourisInt pos = it.next();
    				try{
    					g.drawImage(this.img,pos.getX(),pos.getY(),this);
    				}
    				catch(RemoteException re){
    					System.out.println("Error");
    					re.printStackTrace();
    				}
    			}
    		}
    	}

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut
    J'ai essayé de rajouter le paintComponent() mais aucun changement.
    Je vais voir si le problème se pose avec les autres méthode paintXXX().

    Merci pour ta réponse

  4. #4
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Par défaut
    Si ça peut t'aider je t'envoie ma classe Panel... C'est exactement le même concept que toi: je dessine à partir d'une liste des points sur mon 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    package Geometrie;
     
    import java.awt.Graphics;
    import java.util.ListIterator;
     
    import javax.swing.JPanel;
    import traitement.Fichier;
    import traitement.Point;
     
    /**
     * Méthode permettant de dessiner dans notre panneau.
     * Elle hérite de Jpanel ce qui nous permet de redefinir la méthode PaintComponent
     * permettant de dessiner dans le Panel.
     * 
     * Seul le fichier est neccessaire pour le bon fonctionnement du dessin.
     * Il est à noté que le Fichier est traité à sa création.
     * 
     * @autor Le Borgne Vincent
     *
     */
    public class Panel extends JPanel{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private Fichier saisie;
     
    	public Panel() {
    		super();
    	}
     
    	public Panel(Fichier saisie) {
    		this();
    		this.saisie = saisie;
    	}
     
    	public Fichier getSaisie() {
    		return saisie;
    	}
     
    	public void setSaisie(Fichier saisie) {
    		this.saisie = saisie;
    	}
    	/**
             * @param g le graphique sur lequel nous devons dessiner.
             * Il est important de faire tous les dessins dans cette méthode. Si nous le faisons 
             * dans différentes méthodes nous avons des soucis de stabilité d'image. En effet en utilisant
             * d'autres méthodes, plus simple à coder, l'image disparait à chaque évenement: minimisation, redimentionnement.
             * 
             * Il est indispenssable d'appeler la super méthode PainComponent, pour pouvoir dessiner.
             * 
             * A l'aide d'un itérateur, nous allons parcourir notre liste chainée de Point. Cette liste
             * a été créé en même temps que notre fichier.
             * Nous stoquons chaque coordonnée de point de la liste dans deux variables locales x et y.
             * Nous stoquons aussi les coordonnées du point précedent de la liste, afin de pouvoir tracer 
             * des droites entre les points.
             * Il est important d'adpter les coordonnées de X et Y au format de notre fenetre.
             * Dans un premier temps, nous cadrons chaque point en lui soustraiant la plus petite des valeurs
             * Ensuite nous multiplions par le coeficient d'ajustement.
             * Notre axe des ordonnées est inversé par rapport à l'axe terrestre, nous multilions chaque valeur par -1
             * afin d'inverser l'axe.
             */
    	public void paintComponent(Graphics g){
    		if(this.saisie!=null){
    			super.paintComponent(g);
    			ListIterator<Point> iter= saisie.getListPoint().listIterator(0);
    			Point temp=new Point();
    			temp=iter.next();
    			int x=(int)((temp.getLongitude()-saisie.getEchelle().getMinimumX())*saisie.getEchelle().getCoef());
    			int y=(int)((temp.getLatitude()-saisie.getEchelle().getMinimumY())*saisie.getEchelle().getCoef()*-1);
    			int xPrec=x, yPrec=y;//La première ligne ne sert à rien. c'est simplement de l'initialisation
    			if(x<0||x>600||y>600||y<0)
    				System.out.println("X= "+ x + " Y= "+ y);
    			g.drawOval(x, y, 1, 1);
    			while(iter.hasNext()){//Tant qu'il y a un élément dans la liste
    				temp=iter.next();
    				x=(int)((temp.getLongitude()-saisie.getEchelle().getMinimumX())*saisie.getEchelle().getCoef()-saisie.getEchelle().getAjustZoomX());
    				y=(int)((temp.getLatitude()-saisie.getEchelle().getMinimumY())*saisie.getEchelle().getCoef()*-1-saisie.getEchelle().getAjustZoomY());
    				g.drawOval(x, y, 1, 1);
    				g.drawLine(x,y,xPrec,yPrec);
    				if(x<0||x>600||y>600||y<0)
    					System.out.println("X= "+ x + " Y= "+ y);
    				xPrec=	x;
    				yPrec= y;
    			}
    		}
    	}
     
     
    }
    et pour appeler le repaint():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Fichier fich= new Fichier(nomFichier);
    				this.frame.pan.setSaisie(fich);
    				this.frame.pan.repaint();
    Un peu bourrin mais si ça marche chez moi... ça devrait marcher chez toi

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut
    J'ai trouvé mon problème, c'était bête mais fallait y penser, j'ai juste rajouter super.paint(g); au début de ma fonction paint.

    Voila comment perdre 2 heures à chercher pour rien.

    En tout cas merci beaucoup pour ton aide

  6. #6
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par Mister_Kp Voir le message
    J'ai trouvé mon problème, c'était bête mais fallait y penser, j'ai juste rajouter super.paint(g); au début de ma fonction paint.
    Il ne faut pas toucher à la méthode paint(g) elle gère plus de choses que simplement le dessin à l'écran.
    Pour dessiner sur un JComponent, il faut simplement overrider paintComponent(Graphics).

  7. #7
    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
    Quoi qu'il en soit pour modifier la façon dont un JComponent se dessine mieux vaut passer par une redéfinition de la méthode paintComponent plutôt que par la méthode paint (la méthode paint ayant pour but d'appeler plusieurs méthodes dont paintComponent)

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

Discussions similaires

  1. problème de rafraichissement repaint()
    Par toma03 dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 29/07/2009, 16h43
  2. Repaint() et rafraichissement
    Par littleqi dans le forum 2D
    Réponses: 4
    Dernier message: 14/02/2007, 10h00
  3. Réponses: 4
    Dernier message: 08/10/2006, 15h16
  4. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  5. Timage rafraichissment
    Par Rizzla dans le forum Composants VCL
    Réponses: 5
    Dernier message: 16/09/2002, 17h08

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