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 :

[SWING][JList] Réference à un objet depuis une ligne


Sujet :

Composants Java

  1. #1
    Invité
    Invité(e)
    Par défaut [SWING][JList] Réference à un objet depuis une ligne
    Bonjour,

    j'ai deux JList.
    La première est rempli d'objets (obj1)
    Chacuns des mes obj1 contient une collection d'oobjets (obj2)
    Lorsque l'on sélectionne un objet (obj1) dans ma premiere liste, il place ces obj2 dans ma deuxiéme liste.
    Mais
    Alors que dans ma premiére liste j'ai les libellés de mes objets.
    Dans la seconde il écrit un truc du style : java.util.AbstractList$Itr@18a7efd..

    Methode de obj1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	public void printChildToList(ActionsList liste){
    		liste.Items.removeAllElements();
    		Iterator it = enfants.iterator();
    		while(it.hasNext()){
    			it.next();
    			liste.Items.addElement(it);
    			((Actions)it).getLibelle();
    		}
    		//liste.setListData(new Vector(enfants));
    	}
    Comment faire pour avoir dans ma deuxiéme liste le libellé de mon objet (tout en gradant une référence sur celui-ci) ?

    Pour ma premiére liste j'ai fait new JList(Array[] obj1) mais pour la seconde je ne peux plus faire ça car la liste existe déja..

    ps : obj1 et obj2 ont tous les deux une méthode toString() qui retourne leur libellé

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Je pense que tu devrais utiliser les Jlist à base de ListModel.

    Tu as d'un coté tes objets, de l'autre le libéllé, que tu renvoies par le biais de la méthode Object getElementAt(int index).

  3. #3
    Invité
    Invité(e)
    Par défaut
    j'ai essayé ceci :
    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
     
    public class ActionsList extends JList{
     
    	private JList liste = this;
    	private DefaultListModel model =new DefaultListModel();
     
    	public ActionsList(){
    		init();
    	}
    	public ActionsList(Collection col){
    		init();
    		fill(col);
    	}
     
    	private void init(){
    		model = new DefaultListModel();
    		liste = new JList(model);	
    		liste.setVisible(true);
    	}
     
    	public void fill(Collection col){
    		System.out.println("Remplis la liste avec "+col.size()+" elements.");
    		Iterator it = col.iterator();
    		while(it.hasNext()){
    			model.addElement((Actions)it.next());
    		}
    	}
     
    }
    Mais je n'ai rien dans ma liste. Pourtant le system.out.println me donne : "Remplis la liste avec 11 elements."

    edit :
    j'ai rajoute ceci dans mon while :
    System.out.println("AJoute"+it);
    et ça me donne :
    AJoutejava.util.AbstractList$Itr@b89838

  4. #4
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Tu peux donner le code de Action?

    Citation Envoyé par Blaise1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private JList liste = this; 
       private DefaultListModel model =new DefaultListModel();
    Simple conseil, enlève les initialisations (this et le new). Tu les initialises dans ton init
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est normal que rien ne s'affiche tu associe le modèle avec la JList interne qui n'est pas utilisé !!! Ce n'est pas de l'héritage tu n'as pas besoin de recréer un JList en interne tu dois utiliser la classe courante...

    De plus lorsque tu as plusieurs constrcuteurs, je te conseille d'utiliser le plus complet dans les autres constructeurs...

    Enfin setVisible(true) ne sert à rien sur les composants, ils sont affiché une fois que la fenêtre parent est visible...


    Cela donnerait :

    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
    public class ActionsList extends JList {
     
    	private DefaultListModel model = new DefaultListModel();
     
    	public ActionsList(){
    		init();
    	}
     
    	public ActionsList(Collection col){
    		this.setModel(this.model);
    		if (col!=null) {
    			fill(col);
    		}
    	}
     
    	public void fill(Collection col){
    		System.out.println("Remplis la liste avec "+col.size()+" elements.");
    		Iterator it = col.iterator();
    		while(it.hasNext()){
    			model.addElement((Actions)it.next());
    		}
    	}
    }

    J'allais oublier : si ta fenêtre est déjà visible lorsque tu crées ton objet 'ActionsList', tu dois le faire dans l'EDT (voir SwingUtilities.isEventDispatchThread() et SwingUtilities.invokeLater())


    a++

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba
    C'est normal que rien ne s'affiche tu associe le modèle avec la JList interne qui n'est pas utilisé !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		this.setModel(this.model);
    oui je m'en doutais un peux mais je n'avait pas vu setModel()..


    Merci, je vais m'y remettre tout de suite..

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba
    De plus lorsque tu as plusieurs constrcuteurs, je te conseille d'utiliser le plus complet dans les autres constructeurs...
    Oui ok mais je ne vois pas trop comment ..

  8. #8
    Invité
    Invité(e)
    Par défaut
    Voilà, je parviens à remplir ma première liste.
    Maintenant lorsque je clique sur un des éléments de ma liste, j'appelle cette méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	/** 
             * Ecris la liste des enfants dans une JListe 
             * @param liste <em>ActionsList</em> liste dans laquelle il doit écrire ces enfants
             */
    	public void printChildToList(ActionsList liste){
    		Iterator it = enfants.iterator();
    		while(it.hasNext()){
    			liste.model.addElement(it.next());
    		}
    	}
    La fonction est appellée mais il ne m'affiche rien dans la liste passée en paramètres.
    J'ai pourtant utilise invokeLater..

  9. #9
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    t'as essayé de faire un validate ou un repaint?
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  10. #10
    Invité
    Invité(e)
    Par défaut
    Oui mais ça ne change rien..
    Je dois le faire sur ma liste quand même ?

  11. #11
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Blaise1
    Oui ok mais je ne vois pas trop comment ..
    En utilisant l'appel à this() qui permet d'appeller un autre constructeur de la même classe (c'est ce que je voulais faire dans le code de mon précédent message mais j'ai oublié de remplacer le init()... ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       public ActionsList(){
          this(null); // Appel de ActionsList(Collection)
       }
     
       public ActionsList(Collection col){
          this.setModel(this.model);
          if (col!=null) {
             fill(col);
          }
       }
    Ca permet de centraliser tout le code dans le même constructeur, les autres se contenterons ensuite de l'appeller...



    Citation Envoyé par Blaise1
    La fonction est appellée mais il ne m'affiche rien dans la liste passée en paramètres.
    J'ai pourtant utilise invokeLater..
    Bizarre... tu es sûr que 'enfants' n'est pas vide ?

    Au fait pourquoi ne pas utiliser fill(), ce serait plus 'propre' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void printChildToList(ActionsList liste){
    		liste.fill(enfants);
    	}
    a++

  12. #12
    Invité
    Invité(e)
    Par défaut
    Pour vérifier ce que vaut enfant j'ai rajouté queqlues system.out :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	/** 
             * Ecris la liste des enfants dans une JListe 
             * @param liste <em>JList</em> liste dans laquelle il doit écrire ces enfants
             */
    	public void printChildToList(ActionsList liste){
    		Iterator it = enfants.iterator();
    		System.out.println("je dois ajouter : "+ enfants.size());
    		while(it.hasNext()){
    			System.out.println("J'ajoute " + it.next());
    		}
    		liste.repaint();
    	}
    Le résultat est le suivant :

    je dois ajouter : 1
    J'ajoute null
    je dois ajouter : 1
    J'ajoute null

    Donc j'ai bien quelque chose dans ma Collection MAIS
    * Pourquoi écrit-il deux fois 'je dois ajouter..' alors que je n'ai cliqué qu'une fois
    * pourquoi 'null' ?

    Si je fait it.toString() dans ma boucle il me donne ceci :
    java.util.AbstractList$Itr@8a0d5d


    Si je crée un nouvel objet enfant directement dans ma boucle alors j'ai bien le toString() de cet objet.

    Mon iterateur me retourne un 'Object'. Il faudrait que je puisse le caster en objjet dont j'ai besoin (Actions)

    Avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    			while (it.hasNext()) {
    				it.next();
    				Actions tmp = new Actions(2);
    				liste.model.addElement(tmp);
    				System.out.println("J'ajoute " + tmp);
    			}
    et ceci dans Actions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	public String toString() {
    		if(this.libelle!=null)
    			return this.getLibelle();
    		else
    			return "Objet Actions";
    	}
    J'ai comme résultat
    Affiche
    J'ajoute Objet Actions
    J'ajoute Objet Actions
    Affiche
    J'ajoute Objet Actions
    J'ajoute Objet Actions


    Mais toujours rien dans ma liste...

  13. #13
    Invité
    Invité(e)
    Par défaut
    Voilà, l'astuce est la :
    this.setModel(model)..

    En fait j'ajoute mes éléments dans le model et ensuite je replace le model dans la JList.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public void fill(Collection col){
    		System.out.println("ActionsList va ajouter " + col.size() +" elements à son model" );
    		Iterator it = col.iterator();
    		while(it.hasNext()){
    			model.addElement(it.next());
    		}
    		this.setModel(model);
    	}
    Et puis si on ne veux pas cumuler on place un model.clear() au debut de la méthode.


    Merci beaucoup à tous

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

Discussions similaires

  1. Récupérer l'objet associé à une ligne de datagrid
    Par tiboleo dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/04/2007, 10h16
  2. [POO] Acces aux attributs d'un objet depuis une methode evenement :s
    Par NikoGJ dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2006, 19h01
  3. Réponses: 4
    Dernier message: 08/03/2006, 19h07
  4. [Swing][JList] Placer un Objet dans une liste
    Par Invité dans le forum Composants
    Réponses: 1
    Dernier message: 17/02/2006, 10h31
  5. Appeler une URL avec & depuis une ligne de commande
    Par Fritzoune dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 13/02/2006, 14h52

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