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

avec Java Discussion :

Problème de rafraîchissement d'un JTextArea


Sujet :

avec Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 226
    Points : 225
    Points
    225
    Par défaut Problème de rafraîchissement d'un JTextArea
    Bonjour tout le monde,

    J'ai un soucis de rafraîchissement sur un JTextArea.

    J'ai tout réunis sur une classe pour faciliter l'aide.

    Voyez plutôt...
    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
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class FenetreCompteur extends JFrame implements ActionListener {
     
    	public JLabel label;
    	public JTextArea texte;
    	public JButton bouton;
    	public Font police;
     
    	public FenetreCompteur() {
     
    		setLayout(new GridLayout(3, 0));
     
    		this.label = new JLabel(" Compteur");
     
    		this.police = new Font("Courier", Font.BOLD, 20);
     
    		this.texte = new JTextArea();
    		this.texte.setFont(police);
    		this.texte.setEditable(false);
     
    		this.bouton = new JButton("GO");
    		this.bouton.addActionListener(this);
     
    		getContentPane().add(this.label, BorderLayout.NORTH);
    		getContentPane().add(this.texte, BorderLayout.SOUTH);
    		getContentPane().add(this.bouton, BorderLayout.SOUTH);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		setLocationRelativeTo(this);
     
    		setSize(200, 150);
     
    	}
     
    	public static void main(String[] args) {
     
    		FenetreCompteur fenetre = new FenetreCompteur();
     
    		fenetre.pack();
    		fenetre.setVisible(true);
     
    		///////////////////////////////////////////////////////////////////
    		///////////////////////////////////////////////////////////////////
     
    		//Si j'appele la méthode ici, ça fonctionne, mais je ne veux pas la chose comme ça,
    		//je le souhaite vraiment lorsqu'on appuie sur le bouton...
     
    		//fenetre.rafraichirJTextArea();
     
    		///////////////////////////////////////////////////////////////////
    		///////////////////////////////////////////////////////////////////
     
    	}
     
    	public void rafraichirJTextArea() {
     
    		this.texte.repaint();
     
    		//Petit compte à rebours
    		for(int i = 10; i >= 0; i --) {
    			String compteur = Integer.toString(i);
    			try {
    				Thread.sleep(500);
    				this.texte.setText(" " + compteur);
    				this.texte.getText();
    				System.out.println(this.texte.getText()); // juste pour voir
    			}
    			catch(Exception e) {
    				System.err.println("Erreur : " + e);
    			}
    		}
     
    	}
     
    	public void actionPerformed(ActionEvent e) {
     
    		// Le problème est que le bouton garde le "focus" jusqu'à la fin du décompte
    		if(e.getSource().equals(this.bouton)) {
    			this.rafraichirJTextArea();
    		}
     
    	}
     
    }
    Au fait je souhaite qu'il affiche le décompte dans la JTextArea.
    Dans la main (en commentaire), en appelant la méthode rafraichirJTextArea(), ça joue (si vous testez vous verrez), mais si je fais appel de la méthode avec le bouton, rien à faire !

    Quelqu'un a-t-il la gentillesse de m'aider ?

    Par avance merci à tous !

    Cdt, Antoniom.
    Cdt, Antonio.

  2. #2
    Membre habitué
    Homme Profil pro
    SAQ
    Inscrit en
    Novembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : SAQ
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 167
    Points : 194
    Points
    194
    Par défaut
    Je peux me tromper mais selon moi, c'est ujne question de Threads
    Ce n'est pas le boutton qui conserve le focus à proprement parler mais le Thread que tu créés qui prend dès lors l'avant plan.

    pour une piste de solution, je te suggère de lire ceci

    Bon courage!
    Si derrière tout homme il y a une femme, devant ce même homme il y a l'ordinateur que cette femme a bousillé
    ---------

    Documentation is like sex: when it is good, it is very, very good; and when it is bad, it is better than nothing. (Dick Brandon)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 226
    Points : 225
    Points
    225
    Par défaut
    Hello,

    Merci de me répondre !

    Malheureusement mon anglais...

    Mais c'est donc qu'il faudrait que je fasses deux Threads ?

    Cdt.
    Cdt, Antonio.

  4. #4
    Membre habitué
    Homme Profil pro
    SAQ
    Inscrit en
    Novembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : SAQ
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 167
    Points : 194
    Points
    194
    Par défaut
    regarde ce tuto direct de DVP
    Si derrière tout homme il y a une femme, devant ce même homme il y a l'ordinateur que cette femme a bousillé
    ---------

    Documentation is like sex: when it is good, it is very, very good; and when it is bad, it is better than nothing. (Dick Brandon)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 226
    Points : 225
    Points
    225
    Par défaut
    Bonjour tout le monde,

    Merci Laurent mais un poil trop complexe pour moi encore tout ça, mais bon, j'ai essayé avec l'interface Runnable mais rien à faire, je n'y parviens pas .

    Si une bonne âme veut bien me montrer avec mon exemple (voir post1)...

    Juste pour préciser : je ne veux pas qu'il affiche et dans la fenêtre et sur la console (supprimer le System.out.println(this.texte.getText()), je veux juste qu'en appuyant sur le bouton "Go" qu'il lance le décompte et l'affiche dans la JTextArea.

    Encore merci à tous !

    Cdt, Antoniom.
    Cdt, Antonio.

  6. #6
    Membre habitué
    Homme Profil pro
    SAQ
    Inscrit en
    Novembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : SAQ
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 167
    Points : 194
    Points
    194
    Par défaut
    Je suis au boulot mais dès que je rentre chez moi je charge mon coffre à outil et j'essaie de te bidouller un truc
    Si derrière tout homme il y a une femme, devant ce même homme il y a l'ordinateur que cette femme a bousillé
    ---------

    Documentation is like sex: when it is good, it is very, very good; and when it is bad, it is better than nothing. (Dick Brandon)

  7. #7
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Pas la peine d'utiliser un Thread, un simple Timer Swing fait largement l'affaire :
    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
     
    import java.awt.BorderLayout;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextArea;
    import javax.swing.Timer;
     
     
     
     
    public class FenetreCompteur extends JFrame implements ActionListener{
     
        private JLabel label;
        private JTextArea texte;
        private JButton bouton;
        private Font police;
     
        //Ajout timer et compteur
        private Timer timer;
        private int compteur;
     
        public FenetreCompteur() {
     
            setLayout(new GridLayout(3, 0));
     
            //initialisation timer et compteur
            this.timer =  new Timer(1000, this);
            this.compteur = 10;
     
            this.label = new JLabel(" Compteur");
     
            this.police = new Font("Courier", Font.BOLD, 20);
     
            this.texte = new JTextArea();
            this.texte.setFont(police);
            this.texte.setEditable(false);
     
            this.bouton = new JButton("GO");
     
            //Listener du bouton, lance le timer
            this.bouton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    timer.start();
                }
            });
     
            getContentPane().add(this.label, BorderLayout.NORTH);
            getContentPane().add(this.texte, BorderLayout.SOUTH);
            getContentPane().add(this.bouton, BorderLayout.SOUTH);
     
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            setLocationRelativeTo(this);
     
            setSize(200, 150);
     
        }
     
        public static void main(String[] args) {
            FenetreCompteur fenetre = new FenetreCompteur();
     
            fenetre.pack();
            fenetre.setVisible(true);
        }
     
     
        //Pour le timer, met à jour "texte"
        public void actionPerformed(ActionEvent e) {
            texte.setText(compteur+"");
            compteur--;
     
            if(compteur < 0){
                timer.stop();
            }
        }
    }
    ps : évite les imports à *, ça te posera des problèmes un jour
    Ctrl+Shit+I dans les IDE (éclipse,netbeans) pour ajouter automatiquement les imports.
    pss: mets tes attributs de classe en private, ça t'évitera aussi des problèmes plus tard
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Voilà une petite solution qui marche avec les threads :

    Une classe héritant de la classe Thread qui définit la tache :
    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
     
    public class MonThread extends Thread{
    public FenetreCompteur b;
        MonThread(FenetreCompteur a){
        b=a;
        }
        public void run(){
            Go();
        }
        public void Go(){
     
    	b.texte.repaint();
     
    		//Petit compte à rebours
    		for(int i = 10; i >= 0; i --) {
    			String compteur = Integer.toString(i);
    			try {
     
    				b.t.sleep(500);
    				b.texte.setText(" " + compteur);
    				b.texte.getText();
    				//System.out.println(this.texte.getText()); // juste pour voir
    			}
    			catch(Exception e) {
    				System.err.println("Erreur : " + e);
    			}
     
                    }
     
     
    }
    }
    Et ta classe FenetreCompteur
    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
     
     
    import java.awt.BorderLayout;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextArea;
     
    /**
     *
     * @author Black Lagoon
     */
     
    public class FenetreCompteur extends JFrame implements ActionListener {
     
    	public JLabel label;
    	public JTextArea texte;
    	public JButton bouton;
    	public Font police;
            public Thread t;
    	public FenetreCompteur() {
    //instanciation du nouveau Thread
                    t = new MonThread(this);
     
     
    		setLayout(new GridLayout(3, 0));
     
    		this.label = new JLabel(" Compteur");
     
    		this.police = new Font("Courier", Font.BOLD, 20);
     
    		this.texte = new JTextArea();
    		this.texte.setFont(police);
    		this.texte.setEditable(false);
     
    		this.bouton = new JButton("GO");
    		this.bouton.addActionListener(this);
     
    		getContentPane().add(this.label, BorderLayout.NORTH);
    		getContentPane().add(this.texte, BorderLayout.SOUTH);
    		getContentPane().add(this.bouton, BorderLayout.SOUTH);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		setLocationRelativeTo(this);
     
    		setSize(200, 150);
     
    	}
     
    	public static void main(String[] args) {
     
    		FenetreCompteur fenetre = new FenetreCompteur();
                    fenetre.pack();
    		fenetre.setVisible(true);
     
    	}
     
     
     
    	public void actionPerformed(ActionEvent e) {
     
    		if(e.getSource().equals(this.bouton)) {
            //Demarage du Thread
                        try{
                        t.start();
                        }catch(Exception ex){
                            System.out.println(ex.getMessage());
                        }
    		}
     
    	}
     
    }
    Il y a quelques exceptions à la fin (Lors du clique sur Go une deuxième fois), mais maintenant je suis un peu occupé avec un projet (Je voulais juste prendre un peu d'air ;P), c'est a toi de le résoudre.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 226
    Points : 225
    Points
    225
    Par défaut
    Laurent, Ivelios, Black Lagoon, Forum,

    Merci infiniment pour vos réponses.

    Je suis certain qu'elles sont nickels mais je jetterai un oeil demain et vous tiens au courant dès que j'aurais compris (ou pas ).

    Ok Black Lagoon, vais tâcher de résoudre ce problème de bouton
    Ivelios merci pour les conseils concernant les import* et l'accessibilité de mes classes

    Merci encore et vous tiens au courant demain !

    Bonne soirée !

    Cdt, Antoniom.
    Cdt, Antonio.

  10. #10
    Membre habitué
    Homme Profil pro
    SAQ
    Inscrit en
    Novembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : SAQ
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 167
    Points : 194
    Points
    194
    Par défaut
    Moi je prévillégie la solution de Ivelios
    Un timer swing c'est simple.. on se casse pas la tête.. plus facile à lire côté cohérence du code, non ?

    Bon, c'est sûr que les Threads c'est un must en termes académique...Il devra savoir comment ça marche alors pourquoi pas plonger de suite dans les nouilles....

    à lui de voir

    Content d'avoir pu être utile
    Si derrière tout homme il y a une femme, devant ce même homme il y a l'ordinateur que cette femme a bousillé
    ---------

    Documentation is like sex: when it is good, it is very, very good; and when it is bad, it is better than nothing. (Dick Brandon)

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 226
    Points : 225
    Points
    225
    Par défaut
    Hello tout le monde,

    Vraiment géniales vos solutions. Que ce soit celle d'Ivelios ou celle de Black Lagoon..

    Je gardes les deux solutions dans mon tiroir...

    Merci infiniment à vous tous !

    Bonne soirée à tous !!

    Cdt, Antoniom.
    Cdt, Antonio.

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

Discussions similaires

  1. Problème de rafraîchissement
    Par vali7 dans le forum Langage
    Réponses: 1
    Dernier message: 18/04/2006, 18h12
  2. Réponses: 2
    Dernier message: 27/02/2006, 13h27
  3. [MFC] Problème de rafraîchissement
    Par nmarf dans le forum MFC
    Réponses: 5
    Dernier message: 16/09/2005, 10h55
  4. Problème de synchronisation dans un JTextArea
    Par wutang dans le forum Composants
    Réponses: 3
    Dernier message: 21/06/2004, 15h06
  5. Problème de rafraîchissement de données...
    Par Alain Dionne dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/03/2004, 21h07

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