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 :

Impossible de rafraichir JFrame.


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Impossible de rafraichir JFrame.
    Bonjour à tous,

    Je sais que c'est un problème récurrent, très récurrent, mais malgré toutes mes recherches sur Google et sur ce forum, je n'ai pas réussi à régler mon problème : mettre à jour l'affichage de ma JFrame, ou éventuellement d'un Component, à l'interieur d'une boucle for.

    Pour simplifier, je prend un exemple simple : J'ai une fenetre avec 2 JButton : un bouton A et un bouton C. En cliquant sur le bouton A, le bouton C change de couleur, à l'aide d'une fonction changeCol(). Ici pas de problème, tout marche comme je le souhaite.
    En revanche, je voudrai pouvoir, à l'interieur d'une boucle for, exécuter 1000 fois ma fonction changeCol(). J'ai fait la chose suivante : (fenetre représente ma JFrame)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int i = 0;i<1000;i++){
    	changeCol();
    	fenetre.validate();
    }
    Cela ne fonctionne pas, ça me rafraichit l'affichage uniquement à la fin des 1000 itérations. Ne fonctionne pas non plus en remplacant validate() par repaint()

    Je précise que dans ma fonction changeCol(), j'ai ajouté des instructions à forte complexité, afin de ralentir l'exécution de la fonction et pouvoir ainsi suivre l'avancement de l'exécution.

    J'espère que vous arriverez à comprendre ce que je raconte... Je joins à ce message le fichier .java, au cas où quelqu'un aurait le courage de se plonger dedans.

    Merci d'avance pour vos réponses.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Le composant n'est mis à jour qu'après le traitement des évènements. Même si tu appelle repaint() ou autre.

    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
     
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.*;
     
    public class Test implements ActionListener{
    	JFrame fenetre1;
    	JFrame fenetre;
    	JButton cligno;
    	JButton activer;
    	JPanel a = new JPanel();
    	JPanel c = new JPanel();
    	Thread th;
     
    	public static void main(String[] args) {
    		Test t = new Test();
    	}
     
    	public Test(){
    		fenetre1 = new JFrame();
    		fenetre = new JFrame();
     
     
    		fenetre.setSize(400, 400);
    		fenetre1.setSize(400, 400);
     
    		cligno = new JButton("c");
    		cligno.setSize(new Dimension(50,50));
     
    		activer = new JButton("a");
    		activer.setSize(new Dimension(40,40));
    		activer.addActionListener(this);
     
    		a = new JPanel();
    		a.add(cligno);
     
    		c = new JPanel();
    		c.add(activer);
     
    		fenetre1.add(a);
    		fenetre.add(c);
     
    		fenetre.setVisible(true);
    		fenetre1.setVisible(true);
    	}
     
    	public class ChangeCol extends Thread {
    		public ChangeCol() {
    			super();
    			System.out.println("thread created");
    		}
     
    		@Override
    		public void run() {
    			activer.setEnabled(false);
    			System.out.println("thread started");
    			///* Pour faire la boucle quand on clique sur le bouton
    			for(int i = 0;i<1000;i++){
    				System.out.println(i);
    				changeCol();
    				fenetre.invalidate();
    				fenetre.validate();
    				try {
    					Thread.sleep(125);
    					System.out.println("thread paused");
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}//*/Pour faire une seule itération 
    			changeCol();
     
     
    			activer.setEnabled(true);
    		}
     
    		private void changeCol() {
    			if(cligno.getBackground().equals(Color.BLACK)){
    				cligno.setBackground(Color.WHITE);
    			}else{
    				cligno.setBackground(Color.BLACK);
    			}
    		}
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		th = new ChangeCol();
    		th.start();
    		System.out.print("OK");
    	}
    }

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Forcément, ta boucle bloque le déroulement de l'EDT...

    Lecture obligatoire qui expliquera ce comportement: http://gfx.developpez.com/tutoriel/j...ing-threading/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2010, 16h51
  2. [JFrame] Impossible de la cacher
    Par HappyTreeFred dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 18/06/2009, 10h52
  3. pb pour rafraichir jframe
    Par choupachoops dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 04/04/2008, 14h39
  4. [ETAT] rafraichir un état -> est impossible
    Par fredouf dans le forum IHM
    Réponses: 12
    Dernier message: 03/04/2007, 17h01
  5. [JFrame] Rafraichir l'affichage d'1 JFrame
    Par tomburn dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 21/04/2005, 11h39

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