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 :

pb paint et repaint d'une image dans un thread


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut pb paint et repaint d'une image dans un thread
    bonjour,
    après avoir chercher longtemps sur internet comment fonctionne les fonctions paint et repaint, je n'arrive toujours pas à rafraichir une image dans un JPanel.

    Notre code est le suivant:
    dans une classe étendue de JPanel, on récupère une valeur tmp qui vient de la classe CC étendue de thread permettant de récupérer une valeur tmp EN TEMPS REEL. En fonction de cette valeur nous devons afficher l'image soleil ou flocon. Avec la fonction paint() actuel la première image s'affiche mais n'est pas rafraichit.

    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
     
    public class MCC extends JPanel{
     
    	JLabel lImageTps = null;
     
    	//ConditionsClimatiques tConditionsClimatiques;
     
    	private ImageIcon soleil = null; //image du soleil
    	private ImageIcon flocon = null; //image du flocon
     
    	private int tmpPeriodeAnnee =1;
     
    	public MCC(CC tCC) {
     
     
    		// Création et lancement du thread 
    		tmp = tCC.getPeriodeAnnee();
     
     
    		soleil = new ImageIcon("images/soleil.png");
    		flocon = new ImageIcon("images/flocon.png");
     
    		this.add(lImageTps);
    	}
     
     
     
    	//	surcharge de la fonction paint pour dessiner tous les elements de la carte
    	public void paint(Graphics g){
    		Graphics2D graph = (Graphics2D)g;
     
     
    		if (tmp == 1)
    		{
    		//dessiner la carte
    		soleil.paintIcon(this, graph, 0, 0);
    		}
    		else
    		{
    		flocon.paintIcon(this, graph, 0, 0);
    		}
     
    	}
    et notre classe thread donne:
    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
     
    public class CC extends Thread
    {
     
     
        private int periodeAnnee;
        private Horloge tmpHorloge;
     
     
        public CC(Horloge tHorloge)
        {  	
        		// Réference tmpHorloge sur Horloge
        		tmpHorloge = tHorloge;
        }
     
     
     
        public void run ()
    	{
        	try
      	    {
    	      while (this.isAlive ())
    	      {
     
    	      	if( (tmpHorloge.getMois() == 10) || (tmpHorloge.getMois() == 11) )
    	        {
    	        	System.out.println("flocon"); 
     
    	      		periodeAnnee=-1;
    	        }
    	      	else
    	      	{
    	      		System.out.println("soleil");
     
    	        	 periodeAnnee=1;
    	      	}
     
    	      	Thread.sleep (500);
    	      }
      	    }
    	     catch (InterruptedException e) { }
     
    	}
     
     
        public int getPeriodeAnnee()
        {
        	return periodeAnnee;
        }
    }

    Merci.

  2. #2
    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
    Bah à aucun moment (a part dans le constructeur, mais celà n'arrive qu'une fois) tu ne récupère la période de l'année dans ton thread depuis ton composant.

    DOnc il te faut un moyen de vérifier régulièrement l'état de ton thread, pour savoir quelle est la période.

    Dans ce but tu peux utiliser un Timer Swing qui toutes les x millisecondes va vérifier l'état du thread, et apporter les changements nécessaires en fonction de cette valeur.

    Donc pour ta classe MCC (dont il manque des parties je suppose...):


    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
     
    public class MCC extends JPanel{
     
        JLabel lImageTps = null;
     
        //ConditionsClimatiques tConditionsClimatiques;
     
        private ImageIcon soleil = null; //image du soleil
        private ImageIcon flocon = null; //image du flocon
     
        private int tmpPeriodeAnnee =1;
     
        public MCC(CC tCC) {
     
             Timer t = new Timer(50,new ActionListener(){
                   public void actionPerformed(ActionEvent e) {
     
                         tmp =  tCC.getPeriodeAnnee();
                         repaint();
                   }
     
            });
            // Création et lancement du thread 
            tmp = tCC.getPeriodeAnnee();
     
     
            soleil = new ImageIcon("images/soleil.png");
            flocon = new ImageIcon("images/flocon.png");
     
            this.add(lImageTps);
        }
     
     
     
        //    surcharge de la fonction paint pour dessiner tous les elements de la carte
        public void paint(Graphics g){
            Graphics2D graph = (Graphics2D)g;
     
     
            if (tmp == 1)
            {
            //dessiner la carte
            soleil.paintIcon(this, graph, 0, 0);
            }
            else
            {
            flocon.paintIcon(this, graph, 0, 0);
            }
     
        }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut merci
    merci ta réponse était bonne. Il manquait seulement une fonction creatTimer qui retourne le timer.
    Merci beaucoup ca fonctionne.

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

Discussions similaires

  1. Macro qui colle une image dans Paint
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/06/2010, 20h15
  2. pb : paint et repaint d'une image à partir d'un thread
    Par zazou0506 dans le forum Graphisme
    Réponses: 1
    Dernier message: 03/01/2008, 00h57
  3. Charger une image dans un thread
    Par KRis dans le forum Langage
    Réponses: 3
    Dernier message: 25/08/2005, 17h36
  4. [VB6] [Excel] Insérer une image dans une feuille
    Par mathias dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 09/10/2002, 07h44

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