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 :

Problème avec DefaultListModel


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut Problème avec DefaultListModel
    Bonjour,

    J'ai un problème d'utilisation avec une classe que j'ai crée héritant de la classe DefaultListModel, cela concerne la fonction remove(int index) (ainsi que la fonction removeElementAt(int index))

    En fait, je veux supprimer de la liste l'item selectionné, pour cela j'ai un bouton supprimé qui fait deux choses :
    - recupère l'objet selectionné. (et supprime ses correspondances dans la base)
    - supprime l'objet de la liste via son index.

    donc la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int index = getListeVehicule().getSelectedIndex();
    me renvoie le bon index et je peux accéder au infos de l'objet...

    par contre quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getModeleVehicule().remove(index)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getModeleVehicule().removeElementAt(index)
    Cela me supprime automatiquement le dernier item de la liste.

    Mes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private ModeleVehicule getModeleVehicule() {
    		if (modeleVehicule == null) {
    			modeleVehicule = new ModeleVehicule(vectorVehicule);
    		}
    		return modeleVehicule;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private JList getListeVehicule() {
    		if (listeVehicule == null) {
    			listeVehicule = new JList();
    			listeVehicule.setPreferredSize(new Dimension(200, 200));
    			listeVehicule.setModel(getModeleVehicule());
    		}
    		return listeVehicule;
    	}
    ma classe ModelVehicule :
    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
    public class ModeleVehicule extends DefaultListModel {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private Vector<Vehicule> listeDonnees;
     
    	public ModeleVehicule(Vector<Vehicule> list) {
    		listeDonnees = list;
    		setVector();
    	}
     
    	private void setVector() {
    		removeAllElements();
    		for (Iterator<Vehicule> iter = listeDonnees.iterator(); iter.hasNext();) {
    			Vehicule iteration = iter.next();
    			addElement(iteration.getDesignation() + "  " + iteration.getImmatriculation());
    		}
    	}
     
    	public Object getElementAt(int index) {
    		Vehicule iteration = listeDonnees.get(index);
    		return iteration.getDesignation() + "  " + iteration.getImmatriculation();
    	}
     
    	/**
             * Permet de récupérer l'instance du vehicule à l'index de la comboBox/liste précisée.
             * @param index = numéro d'index du véhicule recherché dans la comboBox/liste
             * @return véhicule correspondant
             */
    	public Vehicule get(int index) {
    		return listeDonnees.get(index);
    	}
    }
    Savez vous pourquoi j'obtiens cette réaction ?

    Merci pour votre aide !

  2. #2
    Membre éprouvé Avatar de nicgando
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 128
    Par défaut
    Le seul truc que je pourrai voir c'est que tu ne surcharges ni getModeleVehicule().remove(index) ni getModeleVehicule().removeElementAt(index)

    En gros tu ne surcharges que la moitié des méthodes.

    Exemple le addElement doit ajouter dans la liste du DefaultListModel pas dans ta liste de données

    Bref essaye en surchargeant par exemple removeElementAt sis c'est celle là que tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void removeElementAt(int index){
    listeDonnees.removeElementAt(index);
    }
    Sauf que je sens le IndexOfBoundException car comme dit plus haut quand tu fais addElement tu ajoutes dans le modèle de DefaultListModel pas dans ton modèle

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut
    Bonjour, merci pour ta réponse mais si j'utilise la méthode addElement() non surchargée, ne faudrait-il pas que j'utilise la méthode removeElementAt() non surchargé aussi ?

    Je vais essayer pour voir.

    EDIT : ca n'a rien changé

    Toujours le dernier de la liste qui s'enlève de la liste alors que je supprime bien les infos du véhicule selectionné dans la base...

  4. #4
    Membre éprouvé Avatar de nicgando
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 128
    Par défaut
    J'ai l'impression que tu t'es refais un modèle juste pour avoir un affichage personnalisé à ce moment là ne surchage que la méthode get(int)

    Tu utilises ton modèle pour alimenter quoi ?

    As-tu essayé de débuger ?


    Au fait attention car getElementAt et removeElementAt sont deprecated

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut
    Et bien je voudrais avoir juste le nom du véhicule affiché dans la liste, mais je voudrais tout de même pouvoir récuperer l'objet avec tous les détails du véhicule.

    Ce n'est pas une bonne méthode ?

    J'utilise une classe similaire pour d'autre objets qui marche bien pourtant.

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je pense que c'est à cause de ta déclaration private Vector<Vehicule> listeDonnees;, qui conduit à avoir deux vecteurs pour gérer la liste : l'un qui se trouve - et qui n'est pas visible - dans la classe DefaultListModel, avec lequel travaille la méthode remove, et le tien, avec lequel tu travailles.

    Il y a donc deux valeurs différentes pour faire la même chose.

    Pour résoudre ce problème, soit, comme te le disent les autres, tu re-écris toutes les méthodes, soit tu supprimes la déclaration incriminée, et tu travailles uniquement par appel aux méthodes disponibles dans DefaultListModel.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut
    Je ne peux pas gérer un Vector qui servira à la liste (ici un vecteur de String donc) et n
    un Vector de Vehicule pour pouvoir récupérer l'objet véhicule entier (qui correspondra à la description affiché dans la liste) ?

  8. #8
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Tu peux faire plein de choses, bien sûr, À CONDITION que ce soit cohérent.

    Lorsque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	public Object getElementAt(int index) {
    		Vehicule iteration = listeDonnees.get(index);
    		return iteration.getDesignation() + "  " + iteration.getImmatriculation();
    	}
    Tu renvoies l'objet trouvé dans listeDonnees. C'est bien. Mais lorsque tu fais remove, tu effaces un objet présent dans le vecteur (ou assimilé) de la super classe. Donc il n'est pas supprimé dans listeDonnees, bien sûr. Donc ça ne va pas.

    Si tu veux gérer deux vecteurs différents, comme tu en as parfaitement le droit, il faut que TOUTES les méthodes qui interviennent sur ces vecteurs gèrent les deux vecteurs.

    Donc, une méthode remove (en particulier) écrite approximativement comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public Object remove(int index)
    {
     super.remove(index);
     listeDonnees.remove(index);
    }
    Personnellement je trouve ça casse-gueule de gérer deux vecteurs différents, et je me débrouillerais pour n'en gérer qu'un seul, mais ce n'est pas toujours possible. Essaie selon ce qui te parait le mieux.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut
    Oui en effet ca craint un système bancale...

    Le problème c'est que comme je récupère dans la base tous mes véhicule pour créer la liste, je préfère, comme je suis sur une base distante, memorisée ces véhicule plutôt que de refaire une selection dans la base selon l'immatriculation du véhicule... Parce que les accès à la base coûtent assez cher en temps dans cette configuration j'ai remarqué...

    Merci pour tes précisions en tout cas !

    EDIT : c'était bien ca le problème, merci beaucoup pour votre aide !!

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Par défaut pour les autres
    Clairement ici il est parti sans comprendre ..
    Toujours travailler avec les sources du sdk
    Le Vector est déjà dans DefaultListModel.

    Le problème c'est qu'il a copier à la création sa liste (en prenant soin de faire un removeAllElements() alors qu'à la création, elle "déjà" vide).

    Et ensuite, il fait des get et getElement sur sa liste donc il affiche (récupère) du model les bonnes données mais par contre quand il fait un remove, il appelle la méthode remove de DefaultListModel dont l'implémentation (qu'on ne voit pas ici et c'est pour ça qu'il n'a pas compris) utilise son propre Vector : celui où il a copié tous les éléments dans le constructeur.

    Donc quand il enleve avec remove c'est dans le Vector du DefaultListModel. Ensuite il fait des get (il affiche) sur son Vector qui lui n'est pas modifié.

    Du coup le size dans le DefaultListModel a baissé de 1 puisque le bon élément a bien été retiré. La mise à jour de la JList par le fireEvent indique que la taille est n-1 et ne va pas jusqu'à la fin => à l'affichage le dernier élément est retiré.

    Il faut enlever ce vilain Vecteur et ne surcharger que la méthode dont il a besoin ici : aucune...

    Il suffisait d'utiliser le DefaultListModel tel quel et de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Vehicule v = getVehiculeModel.get(index);
    String s = v.getTonChamps1 + " " + v.getTonChamps2;
    Et d'afficher s, surtout pas trafiquer le get du modèle pour obtenir un String alors que dans le modèle c'est des Vehicule.

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

Discussions similaires

  1. [JList] Problème avec DefaultListModel
    Par tigger_riric dans le forum Composants
    Réponses: 3
    Dernier message: 14/07/2008, 15h54
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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