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

 Java Discussion :

Affichage d'une variable en "temps réel"


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Affichage d'une variable en "temps réel"
    Bonjour à tous,

    Voilà mon problème, je souhaiterais pouvoir afficher une variable qui évolue constamment dans une fenêtre mais je n'y parvient pas.
    Actuellement je parvient à l'actualiser grâce à un togglebutton mais je voudrais qu'elle s'actualise d'elle même dès qu'elle évolue.

    Merci par avance et n'hésitez pas à me préciser si ma demande n'est pas assez claire =)

    Bonne journée !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Thund Voir le message
    Bonjour à tous,

    Voilà mon problème, je souhaiterais pouvoir afficher une variable qui évolue constamment dans une fenêtre mais je n'y parvient pas.
    Actuellement je parvient à l'actualiser grâce à un togglebutton mais je voudrais qu'elle s'actualise d'elle même dès qu'elle évolue.

    Merci par avance et n'hésitez pas à me préciser si ma demande n'est pas assez claire =)

    Bonne journée !
    Salut,

    je suppose que cette variable est affichée dans un JLabel ou un autre composant graphique du genre.

    Quand tu modifies la valeur de cette variable, fait un repaint() sur le composant (ou un des composants qui le contient, comme la fenêtre par exemple) pour forcer la mise à jour de l'affichage (ou un revalidate() sur la fenêtre qui contient le composant d'affichage ) pour forcer la mise à jour du composant (affichage et layout))...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord, merci pour ta réponse!

    Je pense avoir compris ce que tu proposes mais cela me place face à un autre problème: Passer la première fois la variable à mon container.
    Comme tu l'as dit ma variable se trouve dans un JtextField et actuellement elle est actualisé par un evt.

    Si je comprend bien ce que tu m'as dit, il faudrait que je passe ma variable à mon container, via par exemple un .setText() et qu'ensuite je fasse sur ce même container un repaint() ? c'est bien ça ?

    J'espère être suffisamment claire ...

    Bonne soirée !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 639
    Points
    639
    Par défaut
    Bonjour,

    Il faut que ta variable notifie un observateur quand elle change d'état, c'est ensuite ton observateur qui met à jour la vue. C'est le principe du patron Observeur/Observateur. Je te montre un exemple que tu peux jouer :
    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
    import java.awt.BorderLayout;
    import java.util.Observable;
    import java.util.Observer;
     
    import javax.swing.JFrame;
    import javax.swing.JTextArea;
     
    public class TestPatronObserveur {
     
    	public static void main(String[] args) throws InterruptedException {
    		MonModele monModele = new MonModele();
    		MaFenetre maFenetre = new MaFenetre();
     
    		MonObserveur monObserveur = new MonObserveur(maFenetre);
    		monModele.addObserver(monObserveur);
     
    		while (true) {
    			monModele.incrementerMaVariable();
    		}
    	}
     
    	public static class MonModele extends Observable {
    		private int maVariable = 0;
     
    		public void incrementerMaVariable() {
    			maVariable++;
    			setChanged();
    			notifyObservers();
    		}
     
    		public int getMaVariable() {
    			return maVariable;
    		}
    	}
     
    	public static class MonObserveur implements Observer {
    		private MaFenetre fenetre;
     
    		public MonObserveur(MaFenetre fenetre) {
    			this.fenetre = fenetre;
    		}
     
    		@Override
    		public void update(Observable o, Object arg) {
    			fenetre.afficherVariable(((MonModele) o).getMaVariable());
    		}
    	}
     
    	public static class MaFenetre {
    		JFrame frame = new JFrame("Etat de mon modèle en direct");
    		JTextArea champTexte = new JTextArea();
     
    		public MaFenetre() {
    			frame.getContentPane().add(champTexte, BorderLayout.CENTER);
    			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			frame.setSize(300, 300);
    			frame.setVisible(true);
    		}
     
    		public void afficherVariable(int variable) {
    			champTexte.setText(String.valueOf(variable));
    		}
    	}
    }
    Tu peux chercher "pattern MVC" (Modèle Vue Contrôleur) ou "pattern observer/observable" sur Internet tu trouveras pas mal de ressources.

    Romain.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Thund Voir le message
    Tout d'abord, merci pour ta réponse!

    Je pense avoir compris ce que tu proposes mais cela me place face à un autre problème: Passer la première fois la variable à mon container.
    Comme tu l'as dit ma variable se trouve dans un JtextField et actuellement elle est actualisé par un evt.
    OK.

    Citation Envoyé par Thund Voir le message
    Si je comprend bien ce que tu m'as dit, il faudrait que je passe ma variable à mon container, via par exemple un .setText() et qu'ensuite je fasse sur ce même container un repaint() ? c'est bien ça ?
    Oui, enfin, il y a aussi d'autres façon de faire. C'est la plus simple (mais elle t'oblige certes à avoir la référence de ton container dans la méthode qui modifie ta variable, ou toute autre qui permettrait de mettre à jour le jtextfield, directement ou indirectement). Une façon élégante est d'utiliser un système évènementiel (ou d'utiliser le pattern observeur/observé) (ce serait particulièrement efficace si ta valeur était affichée dans plusieurs vues)

    Le repaint() ne doit pas être nécessaire en fait (setText() le fait implicitement normalement), j'en avais parlé au cas ou tu faisais un affichage direct dans le context graphique
    mais un revalidate() peut s'avérer lui nécessaire en fonction de ton layout (pour que la nouvelle valeur soit entièrement visible (normalement avec un jtextfield, on fait plutôt un layout ou la taille du champs ne dépend pas de son contenu, ce qui n'est pas le cas d'un JLabel)... le revalidate() fera aussi un repaint, d'ailleurs si nécessaire

    J'espère être suffisamment claire ...
    oui pas de problème

    Bonne soirée !
    Merci Toi aussi !
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par rg77140 Voir le message
    Bonjour,

    Il faut que ta variable notifie un observateur quand elle change d'état, c'est ensuite ton observateur qui met à jour la vue. C'est le principe du patron Observeur/Observateur. Je te montre un exemple que tu peux jouer :
    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
    import java.awt.BorderLayout;
    import java.util.Observable;
    import java.util.Observer;
     
    import javax.swing.JFrame;
    import javax.swing.JTextArea;
     
    public class TestPatronObserveur {
     
    	public static void main(String[] args) throws InterruptedException {
    		MonModele monModele = new MonModele();
    		MaFenetre maFenetre = new MaFenetre();
     
    		MonObserveur monObserveur = new MonObserveur(maFenetre);
    		monModele.addObserver(monObserveur);
     
    		while (true) {
    			monModele.incrementerMaVariable();
    		}
    	}
     
    	public static class MonModele extends Observable {
    		private int maVariable = 0;
     
    		public void incrementerMaVariable() {
    			maVariable++;
    			setChanged();
    			notifyObservers();
    		}
     
    		public int getMaVariable() {
    			return maVariable;
    		}
    	}
     
    	public static class MonObserveur implements Observer {
    		private MaFenetre fenetre;
     
    		public MonObserveur(MaFenetre fenetre) {
    			this.fenetre = fenetre;
    		}
     
    		@Override
    		public void update(Observable o, Object arg) {
    			fenetre.afficherVariable(((MonModele) o).getMaVariable());
    		}
    	}
     
    	public static class MaFenetre {
    		JFrame frame = new JFrame("Etat de mon modèle en direct");
    		JTextArea champTexte = new JTextArea();
     
    		public MaFenetre() {
    			frame.getContentPane().add(champTexte, BorderLayout.CENTER);
    			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			frame.setSize(300, 300);
    			frame.setVisible(true);
    		}
     
    		public void afficherVariable(int variable) {
    			champTexte.setText(String.valueOf(variable));
    		}
    	}
    }
    Tu peux chercher "pattern MVC" (Modèle Vue Contrôleur) ou "pattern observer/observable" sur Internet tu trouveras pas mal de ressources.

    Romain.

    Je trouve ça lourd moi de devoir déporter une variable dans un Observable pour pouvoir la mettre à jour dans une vue. Et s'il faut implémenter Observable sur toutes les classes contenant des variables susceptibles d'être affichées quelque part, je trouve ça lourdingue aussi.

    Alors que tu peux tout aussi bien appeler directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void afficherVariable(int variable)
    à chaque fois que tu modifies ta variable (éventuellement avec un invokeLater)

    Je dis pas s'il y avait plusieurs vues affichant des dizaines de données, mais un jtextfield unique pour afficher une seule variable...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il y a plein de manière de faire. Le patron observeur/observable est très bien à adapté à des modèles complet de données, ou se n'est pas juste un int ou un String qu'on entoure, mais tout un ensemble structuré de données, quand on veux pouvoir avertir des tiers que ce modèle change (la vue, par exemple, mais aussi un système de undo, un loggueur ou un autre modèle plus global peuvent être intéressé).

    Pour des changement simples, qui partent déjà de l'interface, l'autre solution c'est de rajouter, après la mise à jour de la variable, une ligne qui met à jour le textfield.

    En fait, toute la question à se poser à chaque fois, c'est qui doit prendre la responsabilité de mettre à jour l'affichage: le textfield qui change? le Label qui doit d'adapter comme un grand? Le modèl de données qui doit lui même mettre à jour l'affichage?

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci à vous trois pour vos réponses!

    Ca fait un paquet d'information d'un coup ^^ !
    Je vais essayé de voir ce qui serait le plus adapté dans mon cas et de le mettre en application.
    Je reviendrais vers vous pour vous dire comment je m'en sort !

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    J'ai eu le même type de développement à faire en juin dernier. En fonction de l'évolution d'une base de données j'affichais sur un écran deux compteurs ("Présents" et "Entrées" qui sont des JLabel) mis à jour toutes les 3 secondes. Voici le code que j'ai implémenté et qui tourne super bien.

    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
     
            int cnt = 0;
    	try
    	{
    		while (true)
    		{
    			cnt = Badge.nombrePrésentes()  ; // lire Base de donnée
    			Présents.setText("" + cnt); 
      			cnt = Badge.nombreEntrées();  // lire Base de donnée
      			Entrées.setText("" + cnt); 
    			Thread.sleep(3000);
    			this.repaint();
    		}
    	} 
    	catch(Exception ex){}
    }

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La boucle active est à éviter autant que possible. Surtout dans das cas aussi simples. De plus, ce code est erroné. Les appels à setText() sur les JLabel doivent se faire dans le thread de l'EDT, pas dans ton thread. Et le repaint() est inutile.

Discussions similaires

  1. Réponses: 11
    Dernier message: 16/10/2006, 14h05
  2. Réponses: 10
    Dernier message: 12/07/2006, 11h42
  3. [Dates] Affichage d'une variable
    Par claudesou dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2006, 10h08
  4. Réponses: 4
    Dernier message: 14/12/2005, 08h33

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