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 :

JTable et Modèle : Changement dynamique du modèle


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut JTable et Modèle : Changement dynamique du modèle
    Bonjour,
    j'ai des hésitations concernant la solution technique à apporter à la mise à jour de données dans une table.
    Le problème est complexe à expliquer, prenez moi la main et suivez moi, je vous explique ;-)
    Soit A un composant, rendant N services.
    A chaque service, correspond deux modèles (extends DefaultTableModel).
    A chaque service correspond x inputs (couple nom + valeur servant de données au premier modèle) et y outputs (couple nom + valeur servant de données au second modèle).
    Je veux pouvoir sélectionner dynamiquement le service en cours d'utilisation et donc changer dynamiquement les modèles associes.
    Je vois trois solutions possibles et je ne sais que choisir :
    - je crée un modèle d'inputs contenant toutes les inputs possibles (idem pour les outputs) et je rends visible ou invisilbe les rowsqui m'intèressent selon le service choisi.
    - je crée un modèle vide et je change le modèle via setDataVector(...,...) au changement de sélection de mon service. Un fireTableDataChanged tenant ma table au courant des changement (chose qui se vérifie pas vraiment à cause de la création d'un modèle vide, fireTableStructureChanged() ne semble pas plus efficace)
    - je crée dés le départ autant de modèles (inputs + outputs) que de service possibles (Outch ! Ca pourrait vite être énorme) et je stocke tout ça dans un tableau. Ensuite, je sélectionne et affecte le bon modèle à la sélection du service.

    Voilà, c'était long alors merci de m'avoir suivi.
    Si vous pouviez me donner votre avis voir une solution à laquelle je n'ai pas pensé, ce serait génial !!
    Merci d'avence !!

    Lain

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Je pense que la meilleure solution est la deuxième :

    Tu as un seul modele et tu lui change les données chaque fois que tu as besoin

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Oui, c'est ce que je pensais aussi et avais d'ailleurs mis en place. Mais j'arrive pas à informer la table des changements de structure (le nombre d'inputs et d'outputs pouvant varier).
    Si j'initialise mon modèle avec un premier jeu de données ayant x lignes par exemple et que je le change ensuite par un jeu de données ayant x+3 lignes, les trois dernières sont ignorées par la table ... greugneugneu alors que le modèle les contient bien et que je fais un fireTableStructureChanged()
    J'oublie quoi ?

  4. #4
    Membre du Club Avatar de bubu56
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 58
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par mlle lain
    Oui, c'est ce que je pensais aussi et avais d'ailleurs mis en place. Mais j'arrive pas à informer la table des changements de structure (le nombre d'inputs et d'outputs pouvant varier).
    Si j'initialise mon modèle avec un premier jeu de données ayant x lignes par exemple et que je le change ensuite par un jeu de données ayant x+3 lignes, les trois dernières sont ignorées par la table ... greugneugneu alors que le modèle les contient bien et que je fais un fireTableStructureChanged()
    J'oublie quoi ?
    lors d'ajouts de lignes il faut dire à la table que des lignes ont été ajoutées en appelant fireTableRowsInserted et fireTableRowsDeleted quand tu en supprimes.
    De mémoire, je crois que si tu appelles juste fireTableRowsDeleted(0,oldnbrows) il va mettre à jour la table sans que tu aies besoin d'appeler fireTableRowsInserted (0,newnbrows) (ces méthodes sont implémentées dans AbstractTableModel)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Marche pô ...
    getRowCount() est appelé avant le constructeur de mon modèle.
    Je peux donc pas à ce moment là encore connaître la taille.
    Donc je renvois une valeur bidon (1) et il ne veut plus changer de taille après ..
    J'ai toujours détesté les tables !!

  6. #6
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    J'ai callé sur ce genre de problème il y a 2-3 jours. Montre le code de ton modèle, je pourrai p-e t'aider.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Allons y pour un bout de code :

    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
    68
    69
    70
    71
    72
    73
    74
    public class InputModelSolverTableModel extends DefaultTableModel {
     
        private Facet facet;        
        private Vector values;    
        private Vector names;    
        int numRows = 0;    
     
        public InputModelSolverTableModel(Facet f) {        
            facet = f;              
            names = new Vector();        
            values = new Vector();        
            loadSolver();
        }
     
        // Méthode appele au changement de services
         public void setFacet(Facet f){        
            facet = f;
            loadSolver();
        }
     
        private void loadSolver() {   
            System.out.println("loadSolver");
            String[] tempNames;
            tempNames = new String [facet.getInputNames().length];
            tempNames = facet.getInputNames();
            names.setSize(tempNames.length);
            values.setSize(tempNames.length);               
     
            if (!names.isEmpty())
                names.removeAllElements(); 
            if (!values.isEmpty())
                values.removeAllElements(); 
            for (int i=0; i<tempNames.length; i++) {
                names.add(i, tempNames[i]); 
                values.add(i, null);
            }
            numRows = tempNames.length;
            updateData();
     
        }
     
     
        private void updateData()/*throws FacetNotFoundException*/ {                                    
            setDataVector(values, names);
            fireTableDataChanged();
            fireTableRowsDeleted(0, numRows);
            fireTableRowsInserted(0, numRows);
        }
     
        public int getColumnCount() {
            return 2;
        }
     
        // Méthode appelé avant même l'initialisation et donc la connaissande de la taille
        public int getRowCount() {
            try {
                return facet.getInputNames().length;
            } catch (NullPointerException npe){}
            finally {return 1;}
     
        }
     
        public Object getValueAt(int i, int j) {
            if ( j == 0){
                return names.elementAt(i);       
            }
            if ( j == 1){
                return values.elementAt(i);       
            }
            return null;        
        }
     
      ......
    }
    J'ai rajouté "l'éffacement des tableaux" pour voir si je pouvais "réinitialiser" la taille. Plus j'y réfléchis et moins j'obtiens du code propre
    J'ai déjà dit que je détestais les tables ?

  8. #8
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,
    il y a deux sources d'erreurs dans ton code :
    - la méthode updateData n'a pas lieu d'être, puisque le rafraichissement est automatique. De plus setDataVector ne s'appelle pas ainsi, regarde la javadoc.
    - pour ajouter des données et rafraichir automatiquement la table, utilise plutot super.addRow ou super.insertRow au lieu d'accéder directement à names et values qui sont peut etre dupliquées.

    Comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        private void loadSolver() {   
            System.out.println("loadSolver");
            String[] tempNames = facet.getInputNames();
     
            // on vide le modele
            while(super.getRowCount() != 0)
              super.removeRow(0);
     
            // on ajoute les nouvelles lignes
            for (int i=0; i<tempNames.length; i++) {
              super.addRow(new Object[] {tempNames[i], null});
            }
        }
    Dans ce cas, inutile de surcharger getRowCount(), ni getValueAt(int, int). Tu peux les supprimer.

    [EDIT] d'apres ce que j'ai vu, il est meme inutile d'utiliser les Vector names et values, puisque le AbstractTableModel utilise déjà ses propres listes. Cela serait utile si tu implémentais TableModel directement, mais là ça ne fait que dupliquer les données (et ton problème vient du fait que tu manipules la mauvaise copie des données).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

Discussions similaires

  1. [AC-2010] Remplir dynamiquement un modèle de mail avec champs d'un autre formulaire.
    Par clickandgo dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/08/2013, 14h15
  2. [PPT-2007] Changements dans le modèle de données
    Par jctransler dans le forum VBA PowerPoint
    Réponses: 2
    Dernier message: 17/11/2010, 09h15
  3. [C#] Changement dynamique de police (nfop) ?
    Par Amerok dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/06/2008, 11h42
  4. Changement dynamiquement de la GDB distante en local
    Par ada_b dans le forum Débuter
    Réponses: 4
    Dernier message: 18/05/2005, 13h15
  5. Changement dynamique d'une iframe
    Par davids21 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/05/2005, 13h30

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