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 :

Mise à jour d'une JTable


Sujet :

Composants Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut Mise à jour d'une JTable
    Bonjour,

    Dans mon GUI, j'ai une table dont une colonne doit se remplir programmatiquement sur base des données d'autres colonnes. Après que se soit effectué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.setValueAt(table.getValueAt(row, 2),row,3);
    par exemple, il me faut une instruction pour que la nouvelle valeur mise en [2,3] apparaisse dans le tableau. Laquelle ?

    Merci d'avance.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Citation Envoyé par Chavadam Voir le message
    par exemple, il me faut une instruction pour que la nouvelle valeur mise en [2,3] apparaisse dans le tableau. Laquelle ?
    Bonjour, tu veux placer cette valeur dans quelle cellule de ta table?
    Explice ton problème, dis ce qui ne marche pas et l'on saura t'apporter de l'aide...
    Les données seront copiées dans quelle colonne?
    Ces données proviendront de quelles cellules?
    ....
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Bien le bonjour.

    Au départ, dans monModèleDeTable, je remplis 2 colonnes (0 et 2) d'une JTable de 4 colonnes x N lignes, avec les valeurs des 2 éléments de N objets 'Puissance' d'une " List<Puissance> donnéesDEntrée; ". Cette liste donnéesDEntrée est préalablement remplie par les données provenant d'un fichier .CSV qui ne contient que 2 colonnes (en format String). Les deux colonnes vides sont réservées, dans un deuxième temps, à des valeurs résultant de calculs basés sur les cellules remplies des colonnes .

    Merci, wax78, la discussion "Comment utiliser fireTableDataChanged ?" m'a mis sur la bonne piste : J'ai implémenté un ' fireTableDataChanged(); ' et toute les données provenant de mon fichier .CSV apparaissent (en colonnes 0 et 2) dans ma table, comme désiré.

    Mais toutes les instructions 'fireTableXyz()' ne fonctionnent pour autant.
    A titre de simple essai, je veux copier la valeur d'une cellule ([2,2], en l'occurence) dans une cellule vide voisine ([2,3]) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        table.setValueAt(table.getValueAt(2, 2), 2, 3);
        monModèleDeTable.fireTableCellUpdated(2, 3);
    Mais ' fireTableCellUpdated(2,3); ' ne fait pas parraître la valeur dans la cellule [2,3]. C'est l'objet de cette discussion.

    Quand la documentation d'Oracle parle de 'editable table', s'agit-il
    - A= rien que du fait que l'utilisateur du programme ne peut introduite une nouvelle valeur dans une cellule, ) à partir du clavier
    - ou bien B= A + que les valeurs des cellules ne sont également pas modifiables par le programme ?
    Cette question car la documentation d'Oracle concernant ' AbstractModelTable.setValueAt() ' stipule que si des cellules sont "éditables", il me faut implémenter une fonction ' setValueAt() ' en ' @Override '.
    Dans mon programme, j'ai déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        @Override public boolean isCellEditable(int row, int col)
        {   
            return false;
        }
    pour toutes les colonnes de ma table.

    Merci d'avance.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  5. #5
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    La notion d’éditable existe au niveau de la vue, pas du modèle. La méthode TableModel.setValue n’étant en principe utilisée que par la vue pour modifier une cellule, elle n’a cependant pas besoin de faire quoique ce soit si la vue en question n’est éditable. Ça ne veut pas dire qu’un TableModel ne peut pas évoluer par ailleurs. Évidemment, si tu hérites directement d’un AbstractTableModel, que tu n’as pas redéfini la méthode setValue et que tu l’utilises néanmoins pour modifier tes cellules, ça ne marchera pas. Pour rappel, un AbstractTableModel gère tout sauf le stockage des données, t’obligeant donc à définir getValue (et redéfinir setValue si l’IHM ou toi désire l’utiliser). Si tu n’as besoin ou envie de gérer le stockage dynamique de tes cellules, utilises un DefaultTableModel qui le fera pour toi.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Bien le bonjour.

    Le problème s'est divisé en deux :

    1) ' monModèleDeTable.setValueAt() '
    Merci bien Chatanga pour ton explication concernant
    TableModel.setValueAt()
    J'en ai compris que si on ne veut pas que les cellules du JTable soient éditables par le clavier mais qu'elles reflètent constamment et dynamiquement les modifications apportées programmatiquement à son TableModel, setValueAt() et getValueAt() sont indispensables et il vaut mieux utiliser leurs implémentations déjà prévues par la classe DefaultModelTable plutôt que de devoir les implémenter dans une classe 'monModèleDeTable extends AbstractTableModel'.
    Même les instructions 'fireTableXyz()' seraient prévues dans les fonctions implémentées dans DefaultTableModel.

    J'avais implémenté ' monModèleDeTable extends AbstractModelTable' pour un premier essai car
    - la documentation d'Oracle dit explicitement
    Generally, you implement your table model in a subclass of the AbstractTableModel class.
    - Intervention de Michael Morris

    Comme dans mon cas, mon modèle de table doit contenir certaines particularités
    (- le constructeur doit impémenter un contenu de table-bouchon servant d'exemple
    - il doit contenir une fonction supplémentaire : populateTable() ),
    au lieu de déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            monModèleDeTable = new DefaultTableModel();
            table = new JTable(monModèleDeTable);
            ...
            populateTable(fileChooser.getSelectedFile());
            ...
            table.setValueAt(table.getValueAt(2, 2), 2, 3);    // row, col
            monModèleDeTable.fireTableCellUpdated(2, 3);
    , j'ai implémenté 'monModèleDeTable extends DefaultTableModel' (au lieu de 'AbstractTableModel' précédemment) pour y mettre ces deux particularités.

    Mais maintenant apparaît un autre erreur :
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
    at java.util.Vector.elementAt(Vector.java:470)
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
    at choixpuissmachcogén.donnéesDEntrée.FichierDonnéesDEntrée.initGuiComponents(FichierDonnéesDEntrée.java:213)
    à hauteur de mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            table.getColumnModel().getColumn(0).setPreferredWidth(70);
            table.getColumnModel().getColumn(1).setPreferredWidth(10);
            table.getColumnModel().getColumn(2).setPreferredWidth(20);
            table.getColumnModel().getColumn(3).setPreferredWidth(10);
    _ _ _ _ _ _ _ _ _ _

    2) Les instructions ' fireTableXyz() ' s'avèrent inefficaces :
    Dans mon intervention d'hier à 10h, j'écrivais
    J'ai implémenté un ' fireTableDataChanged(); ' et toute les données provenant de mon fichier .CSV apparaissent (en colonnes 0 et 2) dans ma table, comme désiré.
    J'ai remarqué qu'en mettant cette instruction en commentaire les nouvelles données apparaissent aussi dans ma JTable.

    De plus, l'instruction ' fireTableCellUpdated() ' dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        table.setValueAt(table.getValueAt(2, 2), 2, 3);    // row, col
                        monModèleDeTable.fireTableCellUpdated(2, 3);
    ne s'effectue pas, apparemment.

    Brrrrrrr....
    Merci d'avance si vous persistez à m'aider.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  7. #7
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Premier problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DefaultTableModel model = new DefaultTableModel();
    JTable table = new JTable(model);
    // table.getColumnModel().getColumn(0).setPreferredWidth(200); // -> Boom !
    model.setColumnCount(3); // Il y a d’autres moyens de fixer le nombre de colonnes.
    table.getColumnModel().getColumn(0).setPreferredWidth(200);
    model.addRow(new Object[] { 1, 2, 3 });
    Second problème (si inefficace signifie inutile) :

    Sets the object value for the cell at column and row. aValue is the new value. This method will generate a tableChanged notification.
    in Javadoc

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

Discussions similaires

  1. Mise à jour d'une JTable
    Par kimlaw95 dans le forum Composants
    Réponses: 6
    Dernier message: 03/04/2009, 15h25
  2. Mise à jour d'une JTable (Problème d'affichage)
    Par ouchemhou dans le forum Composants
    Réponses: 29
    Dernier message: 14/08/2008, 13h33
  3. mise à jour d'une JTable => erreur aléatoire
    Par AliLoU` dans le forum Composants
    Réponses: 2
    Dernier message: 30/03/2007, 15h11
  4. Mise à jour d'une JTable en fonction d'une JList
    Par xtaZy dans le forum Composants
    Réponses: 1
    Dernier message: 21/03/2007, 18h25
  5. mise à jour d'une JTable ?
    Par Sakalam dans le forum Composants
    Réponses: 11
    Dernier message: 15/09/2006, 15h06

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