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 :

Actualiser le contenu d'un JLabel


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Par défaut Actualiser le contenu d'un JLabel
    Bonjour,

    J'essaye de terminer un petit programme en java (je débute) et après avoir beaucoup lu et suivi les conseils sur ce forum j'ai presque terminé sauf une partie que je n'arrive à adapter, soit le timer. Je cherche à actualiser le contenu d'un JLabel toutes les 10 secondes mais chaque essai est infructueux.

    Le contenu vient d'une requête vers une base ORACLE qui retourne une chaine de caractère que je place dans une variable et que je "transmet" au JLabel. Tout fonctionne la première fois mais je ne comprends pas comment implémenter une répétition de cette partie.

    Merci pour votre aide..

    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
     
     
    public class FenetreTexte extends JFrame  {
     
        public static String total="";
     
        public FenetreTexte() {
            setTitle("Dossiers"); // titre de la fenêtre
            setSize(600,180); // taille de la fenêtre
            setResizable(true); // redimensionnement possible
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // fermer lors du clic sur la croix
            setAlwaysOnTop(true); // rester toujours au premier plan
     
            // répétition à partie de là
            requete(); // recherche du contenu via une requête SQL sur une base ORACLE
            setContentPane(buildContentPane()); // remplissage de la fenêtre avec le contenu via la variable globale TOTAL remplie par "requete()"
           // fin de la répétition
        }
     
        public static void main(String[] args) {
            FenetreTexte fenetre = new FenetreTexte();
            fenetre.setVisible(true);  // visibilité de la fenêtre principale
              }
    ....}
     
    private JPanel buildContentPane() {
     
            JPanel panel = new JPanel();
            panel.setLayout(new FlowLayout());
            JLabel label = new JLabel("<html>"+total+"</html>"); // remplissage de la fenêtre par la variable globale TOTAL
            panel.add(label);
            return panel;
    }

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Tu dis avoir regardé du côté du timer. C'est effectivement le bon outil.
    Qu'est-ce qui te bloque ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Tu dis avoir regardé du côté du timer. C'est effectivement le bon outil.
    Qu'est-ce qui te bloque ?
    Je comprends le principe du timer mais est-ce-que cette manière vous semble envisageable , soit :
    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
     
    public class FenetreTexte extends JFrame  {
     
        public static String total="";
     
        public FenetreTexte() {
            setTitle("Dossiers"); // titre de la fenêtre
            setSize(600,180); // taille de la fenêtre
            setResizable(true); // redimensionnement possible
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // fermer lors du clic sur la croix
            setAlwaysOnTop(true); // rester toujours au premier plan
     
            // 1er exécution seulement pour remplir la fenêtre principale
     
            requete(); 
            setContentPane(buildContentPane());
     
        }
     
        public static void main(String[] args) {
            FenetreTexte fenetre = new FenetreTexte();
            fenetre.setVisible(true);  // visibilité de la fenêtre principale
     
          // répétition à partir de là
            Timer minuteur = new Timer();
            TimerTask tache = new TimerTask() {
                public void run() {
                    requete();
                    setContentPane(buildContentPane());
                }
            };
            minuteur.schedule(tache, 0, 10000);
          // fin de la répétition
     
        }
    }
     
    private JPanel buildContentPane() {
     
            JPanel panel = new JPanel();
            panel.setLayout(new FlowLayout());
            JLabel label = new JLabel("<html>"+total+"</html>"); // remplissage de la fenêtre par la variable globale TOTAL
            panel.add(label);
            return panel;
    }
    Normalement ça initialise une première fois le contenu de la "Fenetre.texte" puis actualise le contenu après ?

    J'ai lu aussi qu'il y avait le "Thread" ?

  4. #4
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. Pour faire des changements dans l'UI Swing, préfère le javax.swing.Timer au java.util.Timer, qui exécutera sa tâche dans l'Event Dispatch Thread (EDT, le thread de Swing) ; Cependant, dans ton cas, il y a une requête vers une base de données : le bon choixs erait le SwingWorker : il te permettra d'exécuter ta requête dans un thread à part, sans bloquer Swing, et permettra de faire la mise à jour de l'ui dans l'EDT. Une autre idée : utiliser un ExecutorService (Scheduled), peut-être plus adapté au caractère "contenu et infini" du process, et faire la mise à jour avec invokeLater.
    2. Ne reconstruis pas l'UI complètement : change uniquement le texte du JLabel
    3. L'ExecutorService, Le SwingWorker, comme un Timer, le cas échéant, sera plus simple à implémenter que le Thread (en fait, tu ne feras que réimplémenter l'un de ces composants, mais de façon incomplète ou maladroite)
    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.

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 18
    Par défaut
    Merci.

    Mes connaissances en java (proche de 0) ne permettent pas pour le moment de faire tout ça mais je vais suivre les tutoriaux.

    2- j'avais pensé à seulement changer le contenu du la variable globale TOTAL qui alimente le Label mais je ne sais pas s'il faut en plus mettre à jour l'affichage de Label.

    J'ai tenté ce matin une première idée mais j'ai un message d'erreur que je ne comprends pas : "FenetreTexte.java:36: error: non-static method requete() cannot be referenced from a static context"

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par atlanticmac Voir le message
    Mes connaissances en java (proche de 0) ne permettent pas pour le moment de faire tout ça mais je vais suivre les tutoriaux.
    Tu trouveras tous les tutoriels dans la section Tutoriels du site Developpez.

    Exemple avec ExecutorService en Java 8 :

    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
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingConstants;
    import javax.swing.SwingUtilities;
     
    public class Exemple {
     
    	private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
    	private static final long PERIOD = 1; // période en seconde (j'ai mis 1 au lieu de 10 pour qu'on voit plus vite le résultat)
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JLabel label = new JLabel(getTexte(), SwingConstants.CENTER);
     
    		frame.getContentPane().add(label);
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    		ExecutorService updateTask = startUpdate(label);
     
    		frame.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosed(WindowEvent e) {
    				updateTask.shutdown();
    			}
    		});
     
    	}
     
    	private static ExecutorService startUpdate(JLabel label) {
    		ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    		executor.scheduleAtFixedRate(()-> updateLabel(label), PERIOD, PERIOD, TimeUnit.SECONDS);
    		return executor;
    	}
     
    	private static void updateLabel(JLabel label) {
    		String texte = getTexte();
    		SwingUtilities.invokeLater(()-> label.setText(texte));
    	}
     
    	private static String getTexte() {
    		// simulation de requête SQL 
    		return LocalTime.now().format(FORMATTER);
    	}
     
    }


    Le même en Java 7 :

    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
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.text.SimpleDateFormat;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingConstants;
    import javax.swing.SwingUtilities;
     
    public class Exemple {
     
    	private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("HH:mm:ss");
    	private static final long PERIOD = 1; // période en seconde (j'ai mis 1 au lieu de 10 pour qu'on voit plus vite le résultat)
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JLabel label = new JLabel(getTexte(), SwingConstants.CENTER);
     
    		frame.getContentPane().add(label);
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    		final ExecutorService updateTask = startUpdate(label);
     
    		frame.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosed(WindowEvent e) {
    				updateTask.shutdown();
    			}
    		});
     
    	}
     
    	private static ExecutorService startUpdate(final JLabel label) {
    		ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    		executor.scheduleAtFixedRate(new Runnable() {
    			public void run() {
    				updateLabel(label);
    			}
    		}, PERIOD, PERIOD, TimeUnit.SECONDS);
    		return executor;
    	}
     
    	private static void updateLabel(final JLabel label) {
    		final String texte = getTexte();
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				label.setText(texte);
    			}
    		});
    	}
     
    	private static String getTexte() {
    		// simulation de requête SQL 
    		return FORMATTER.format(System.currentTimeMillis());
    	}
     
    }


    Citation Envoyé par atlanticmac Voir le message
    J'ai tenté ce matin une première idée mais j'ai un message d'erreur que je ne comprends pas : "FenetreTexte.java:36: error: non-static method requete() cannot be referenced from a static context"
    On ne peut appeler à partir d'une méthode statique que des méthodes statiques. Pour appeler une méthode d'instance, il faut avoir la référence de l'instance pour laquelle on veut appeler la méthode (une variable qui contient cette référence et qu'on met avant le ., comme par exemple fenetre .requete();, si la méthode requete() est bien dans la classe Fenetretexte.
    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.

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

Discussions similaires

  1. Comment actualiser le contenu d'un répertoire
    Par nbelg27 dans le forum Access
    Réponses: 9
    Dernier message: 28/04/2006, 10h22
  2. [Date] Actualiser une date dans un label.
    Par raph707 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 19/02/2006, 19h36
  3. actualiser le contenu d'une div
    Par Benjiijneb dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 08/02/2006, 10h17
  4. Retourner de 90° contenu [Edit] ou [Label] pour impression
    Par Droïde Système7 dans le forum Composants VCL
    Réponses: 13
    Dernier message: 05/11/2005, 23h10
  5. Réponses: 6
    Dernier message: 04/07/2005, 11h32

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