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

Composants Java Discussion :

Gérer le ré-affichage d'une JList dynamique


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Par défaut Gérer le ré-affichage d'une JList dynamique
    Bonjour à tous.

    Je développe une IHM en Swing, assez simple (pas beaucoup de composants: un textfied, 2 boutons, une textArea et une Jlist permettant de sélectionner un élément).

    Mon problème est le suivant: le contenu de la Jlist qui va être affiché est dynamique : un thread va périodiquement ajouter ou retirer des éléments de cette liste. Je souhaite donc qu'à chaque modification du contenu de la liste, le copmposant JList soit ré-affiché sur mon IHM avec le nouvel ensemble d'élèments.

    Je n'ai vu aucun exemple de code java permettant de ré-afficher dynamiquement un composant comme JList. Savez-vous si ce que je souhaite faire est réalisable ? Si oui, pouvez-vous m'en indiquer les grandes lignes, svp ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Utilise les méthodes du model de ta JList, en l'occurrence DefaultListModel, si tu as le model par défaut:
    add, addElement, remove, fireIntervalAdded, fireContentsChanged...

    Fais attention à modifier ta JList dans l'EDT et non pas dans ton thread de mise à jour.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Utilise les méthodes du model de ta JList, en l'occurrence DefaultListModel, si tu as le model par défaut:
    add, addElement, remove, fireIntervalAdded, fireContentsChanged...

    Fais attention à modifier ta JList dans l'EDT et non pas dans ton thread de mise à jour.
    Quand je fais appel à addElement (par ex.), la JList sera automatiquement ré-affichée dans mon IHM ? Pas besoin de faire appel à des méthodes comme repaint() ?
    Je ne suis pas très calé en IHM java, donc ma question est peut-être saugrenue, mais la solution que tu proposes fr1man me surprend ...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Pas besoin de repaint.

    Si tu ne connais pas l'EDT, tu peux lire cet article:
    http://gfx.developpez.com/tutoriel/j...ing-threading/

    Tu peux également regarder la classe Swingworker.

  5. #5
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Pas besoin de repaint.

    Si tu ne connais pas l'EDT, tu peux lire cet article:
    http://gfx.developpez.com/tutoriel/j...ing-threading/

    Tu peux également regarder la classe Swingworker.
    Merci, je regarde

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par zorglubpok Voir le message
    Quand je fais appel à addElement (par ex.), la JList sera automatiquement ré-affichée dans mon IHM ? Pas besoin de faire appel à des méthodes comme repaint() ?
    Oui c'est tout à fait cela !

    Lorsque tu ajoutes un éléments dans ton modèle, il va générer un évènement qui va signaler les modifications au composant, et ce dernier va donc les mettre à jour...



    Citation Envoyé par zorglubpok Voir le message
    Je ne suis pas très calé en IHM java, donc ma question est peut-être saugrenue, mais la solution que tu proposes fr1man me surprend ...
    Et pourtant cela marche très bien !
    Le plus important étant de ne pas surcharger l'EDT comme l'a indiqué fr1man, tout en modifiant le modèle dans l'EDT (qui doit contenir toutes les modifs sur l'interface).

    La meilleure solution pour cela est d'utiliser SwingWorker. Exemple :
    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
    	// Le model et la JList :
    	final DefaultListModel model = new DefaultListModel();
    	JList list = new JList(model);
     
    	// Le SwingWorker qui sera chargé de générer les données.
    	//
    	// Le paramétrage <Void, Double> signifie ceci :
    	//		Void : Le type de retour de doInBackground() (inutilisé ici)
    	//		Double : Le type de donnée généré qui sera passé à publish()
    	//			(cela permet de traiter les objets dans l'EDT via process())
    	SwingWorker<Void, Double> worker = new SwingWorker<Void, Double>() {
     
    		/*
    		 * doInBackground() est exécuté dans un thread séparé.
    		 * Cela permet de ne pas bloquer l'interface graphique, 
    		 * mais du coup on ne peut pas toucher à l'interface directement.
    		 * 
    		 * => On génère les données (aléatoire ici) puis on les passe à la
    		 * méthode publish(). Cette dernière renverra les données vers la méthode
    		 * process() ci-dessous, mais en l'exécutant dans l'EDT :
    		 */
    		@Override
    		protected Void doInBackground() throws Exception {
     
    			while (true) {
    				// Attente aléatoire entre 0 et 1s :
    				Thread.sleep( (int) (Math.random() * 1000) );
    				// Génération d'un nombre aléatoire entre 0 et 50000:
    				Double d = Math.random() * 50000;
    				// Puis on publie les valeurs :
    				publish( d );
    			}
     
    		}
     
    		/*
    		 * Méthode de traitement des valeurs.
    		 * Cette méthode sera exécuté dans l'EDT avec 
    		 * les paramètres passé à publish().
    		 * Cela permet de mettre à jour l'interface (via la modèle ici)
    		 */
    		@Override
    		protected void process(List<Double> chunks) {
    			// Note : on doit parcourir tous les éléments,
    			// car plusieurs appels à publish() peuvent être regroupé :
    			for (Double d : chunks) {
    				model.addElement(d);
    			}
    		}
    	};
    	// On n'oublie pas de démarrer le Worker :D
    	worker.execute();
     
    	JScrollPane scroll = new JScrollPane(list);
    	scroll.setPreferredSize(new Dimension(200, 400));
     
     
    	JOptionPane.showMessageDialog(null, scroll);
    	System.exit(0);
    a++

  7. #7
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Par défaut
    Bon, je vais regarder ça de plus près, mais en survolant quelques pages de recherche sur Swingworker dans ce forum, j'ai vu qu'il n'était pas conseillé d'utiliser Swingworker avec un thread.
    Or, j'ai absolument besoin (à moins que vous ne me trouviez une autre solution... ) d'utiliser un thread pour aller chercher périodiquement ma liste d'élèments actualisés (celle que je veux afficher) dans une base...access (donc pas de possibilité d'utiliser un trigger).
    Donc, j'ai l'impression que ma seule solution est de gérer un thread pour aller chercher ma nouvelle liste et mettre à jour la JList à partir du thraed EDT.
    Etes-vous en phase avec cette analyse ?

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Heu... SwingWorker utilise déjà un thread... donc je comprend mal cette remarque ! De plus il est spécialement conçus pour faciliter l'utilisation de thread de traitement par dessus une application AWT/Swing... donc j'ai du mal à voir le problème !? (tu as testé mon code ?)


    Bien sûr tu pourrais utiliser un thread "à la main", mais tu vas simplement reproduire les mêmes mécanismes que SwingWorker...


    a++

Discussions similaires

  1. Affichage d'une table dynamique
    Par *alexandre* dans le forum JSF
    Réponses: 1
    Dernier message: 02/07/2009, 10h36
  2. Changer l'affichage d'une JList
    Par jeanGuignol dans le forum Composants
    Réponses: 2
    Dernier message: 29/09/2008, 10h23
  3. Affichage d'une image dynamique
    Par chris81 dans le forum iReport
    Réponses: 1
    Dernier message: 11/01/2007, 11h40
  4. Réponses: 5
    Dernier message: 27/09/2006, 14h07
  5. Question sur l'affichage d'une form dynamique?
    Par Jayceblaster dans le forum Delphi
    Réponses: 1
    Dernier message: 18/09/2006, 14h36

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