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

AWT/Swing Java Discussion :

JCombobox : valeur et index perso ?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 61
    Par défaut JCombobox : valeur et index perso ?
    Bonjour a tous

    Mon problème est à priori assez simple, le problème c est que j ai essayé pas mal de choses et j ai vraiment du mal a obtenir le resultat souhaité

    Pour faire simple je recupere un Vecteur composé d'objects de type Compte ou le premier attribut est l'id du compte (cle primaire) et le second est un libellé.

    Ensuite dans mon appli, j ai une JCombobox, je souhaite afficher dans la liste le libellé (j y arrive sans probleme) mais quand je recupere la valeur ou l index par getSelectedItem ou getSelectedIndex, j aimerai recupéré l'id correspondant a celui dans ma base de données.

    Je pense que cela doit etre possible par l utilisation d'un ComboBoxModel mais j ai bcp de mal a trouver de la documentation sur cette classe... A vrai dire je comprend pas a quels moment sont appelées les methodes qu on redefinit a l interieur.

    J ai aussi lu qu on pouvait faire ca avec un renderer mais ca me parait pas adapté et pas tres propre.

    Bref si vous avez des idées je suis partant

    Merci et @++

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Tu peux effectivement passer par un modèle, mais pourquoi pas ne faire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int id = ((Compte) maCombo.getSelectedItem()).getId();
    ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 61
    Par défaut
    Salut Chtig

    Tout d abord merci pour ta réponse.

    En fait dans ta reponse cela reviendrait a recherche l'id a partir du libelle. Je suis d accord avec ca, le probleme c est que si il existe deux ligne dans la table avec le meme libelle c est le bordel puisqu il y aura 2 id...

    De plus je voulais utilisé un modele car ca m aurait permis de comprendre comment ca marche aussi

    Je suis persuadé qu il existe une solution "propre" a mon probleme mais je vois pas ou

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Non ça ne revient pas à çà.
    Chtig te permet de récupérer l'objet sélectionné, pûis de récupérer l'id de l'élément sélectionné.
    Donc pas de soucis de double ici, tu as bien l'id de l'élément choisi par l'utilisateur

  5. #5
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par Oreste
    [...]mais quand je recupere la valeur ou l index par getSelectedItem ou getSelectedIndex, j aimerai recupéré l'id correspondant a celui dans ma base de données.[...]
    C'est pas clair Tu souhaites récupérer quoi ? L'id du Compte que l'utilisateur à sélectionné ? La solution proposé par chtig est bonne...
    EDIT : grillé sur ce point

    Citation Envoyé par Oreste
    [...]J ai aussi lu qu on pouvait faire ca avec un renderer mais ca me parait pas adapté et pas tres propre.
    Ca n'est peut être, effectivement, pas adpaté à ton besoin, mais c'est très propre comme méthode

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 61
    Par défaut
    Merci pour vos réponses

    J ai encore un peu de mal avec SWING, c est la premiere fois que je fais une appli graphique, je vais tester ca

    Si vous avez des tutoriaux sur l utilisation des "Model" je suis preneurs...

  7. #7
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par Oreste
    Si vous avez des tutoriaux sur l utilisation des "Model" je suis preneurs...
    C'est très simple, je vais tenter une explication :


    Pour la JComboBox, tu dois implémenter l'interface ComboBoxModel. C'est ton implémentation qui va permettre à la JComboBox (l'objet graphique) de savoir ce qu'il doit afficher, ce qu'on peut sélectionner.

    ComboBoxModel (javadoc)

    Pour ce faire, tu dois donc implémenter 2 méthodes principales :
    - getSize : tu dois renvoyer le nombre d'éléments que l'utilisateur pourra sélectionner.
    - getElementAt(int i) : tu dois renvoyer l'élément que l'utilisateur pourra sélectionner pour cet indice i.

    Ensuite, les méthodes getSelectedItem() et setSelectedItem() servent uniquement a mettre et récupérer l'item sélectionné.

    Les 2 premières méthodes sont appelées lors de la création de l'objet graphique JComboBox. Les 2 autres méthodes sont appelées lorsque l'utilisateur sélectionne un item via la JComboBox.

    Elles sont donc appelées automatiquement. Ton programme appelera ensuite, très certainement la méthode getSelectedItem pour récupérer l'item sélectionné par l'utilisateur.

    Les 2 dernières méthodes n'ont d'intérêts que si la liste des item peut être modifiée (ajout d'un nouvel item, suppression, modification...). Elles servent a enregistrer les listeners que ton model devra connaitre pour pouvoir envoyer les évènements de modifications à tous ses listeners (dont l'un d'entre eux est automatiquement la JComboBox).

    Voila, n'hésite pas

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 61
    Par défaut
    Merci enormement Claythest

    Ca m eclaircit un peu plus ! j aurais surement d'autres questions demains sur le model, mais je veux deja tester ca

    Merci !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 61
    Par défaut
    Bon je reviens sur le sujet car j ai un petit soucis avec la solution de Chtig.

    En effet ca marche mais uniquement dans le cas ou je remplis ma liste avec un vecteur contenant des objets de type "compte". Le probleme c est que si je fais ca a l affichage dans la liste j ai "Compte@e80a59"... Par contre des ke je remplis avec les "Libelle" de type String la il nest plus possible de recuperer l'id par son attribut en faisant reference a l objet selectionné...

    J ai fais un test avec un ComboBoxModel et j ai le meme probleme, j arrive pourl element sleectionne a affiché le nom de la personne et recuper son age (j ai fais un test avec une class Personne qui contient le nom et l age)

    Voici le code de la class Model

    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
    import data.Personne;
     
    public class TestModel extends AbstractListModel implements ComboBoxModel {
    	private Vector<Personne> vPersonnes = this.allPersonnes();
    	private Personne selectedPersonne = vPersonnes.get(1);
     
    	public Object getSelectedItem() {
    		return selectedPersonne.getPrenom();
    	}
     
    	public void setSelectedItem(Object anItem) {
    		// TODO Auto-generated method stub
    		//vPersonnes.get(2).getPrenom();
    		selectedPersonne = (Personne)anItem;
    		System.out.println("Age de la personne : " + selectedPersonne.getAge());
    	}
     
    	public Object getElementAt(int index) {
    		if(index < vPersonnes.size()) {
    			return vPersonnes.get(index);
    		} else {
    			return null;
    		}
    	}
     
    	public int getSize() {
    		return vPersonnes.size();
    	}
     
    	public void addListDataListener(ListDataListener l) {
     
    	}
     
    	public void removeListDataListener(ListDataListener l) {
     
    	}
     
    	public Vector<Personne> allPersonnes() {
    		Vector<Personne> vPersonnes = new Vector<Personne>();
     
    		vPersonnes.add(new Personne("Cyril", 27));
    		vPersonnes.add(new Personne("Paul", 24));
    		vPersonnes.add(new Personne("Sarah", 19));
     
    		return vPersonnes;
    	}
    }
    Et la c est le code la classe Personne

    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
    public class Personne {
    	private String prenom;
    	private int age;
     
    	public Personne(String _prenom, int _age) {
    		this.prenom=_prenom;
    		this.age=_age;
    	}
     
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getPrenom() {
    		return prenom;
    	}
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
    }
    Si je change la fonction "getElementAt" pour afficher le nom je n aurais que des objets de type String dans ma liste et c est retour aume probleme

    En fait je voudrais savoir si dans le modele on peut remplir la liste "logiquement" avec des objets (Personne, Compte...) mais a l affichage faire en sorte d afficher les attribut de ces classes qu on desire...

    Desole si mon probleme n est pas clair je sais qu il existe plein d autres solution mais en fait j essaye de comprendre le fonctionnement des objets Swing ...

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Deux solutions sont possibles:

    1. En version propre: affecter un renderer spécifique à ta JComboBox qui va afficher les informations que tu veux: http://java.sun.com/docs/books/tutor....html#renderer
    2. En version sale: redéfinir la méthode toString() de ta classe personne pour qu'ellle renvoie ce que tu veux afficher en libelle

  11. #11
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par Oreste
    En fait je voudrais savoir si dans le modele on peut remplir la liste "logiquement" avec des objets (Personne, Compte...) mais a l affichage faire en sorte d afficher les attribut de ces classes qu on desire...
    Voila, c'est exactement ce que te dis sinok. Par défaut, c'est la méthode toString() de tes item qui est appelé lors de l'affichage dans la JComboBox. Il te faut donc redéfinir un Renderer (je te conseille de faire une classe héritant de BasicComboBoxRenderer et redéfinnissant la méthode getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) en faisant juste un appel a super avec le value égal à ce que tu souhaite afficher) afin d'afficher ce que tu souhaites.


    Citation Envoyé par Oreste
    J ai aussi lu qu on pouvait faire ca avec un renderer mais ca me parait pas adapté et pas tres propre.
    Tu comprends maintenant en quoi c'est très adapté et très propre (du moins je l'espère )

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

Discussions similaires

  1. [JComboBox] récupération d'index
    Par Jean-Claude Dusse dans le forum Composants
    Réponses: 9
    Dernier message: 19/05/2008, 09h34
  2. jcombobox avex des index personalisés
    Par meesmany dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 16/11/2007, 23h54
  3. JComboBox item et index
    Par L4BiN dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 05/01/2007, 11h32
  4. [JComboBox] Perte d'index lors du chargement
    Par sozie9372 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 25/08/2006, 09h34
  5. valeur par défaut perso
    Par bilout dans le forum Langage
    Réponses: 9
    Dernier message: 03/04/2006, 15h29

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