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] récupérer valeur cellule après saisie


Sujet :

Composants Java

  1. #21
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    J'ai refait mon projet en incluant un modèle étendant AbstactTableModele pour rendre certaines colonnes non éditables.
    J'ai un nouveau problème car lorsque je quitte la cellule la saisie ne s'affiche pas, la cellule reste vierge.

    Class Tableau :
    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
    import java.awt.Component;
    import java.awt.Font;
    import javax.swing.AbstractCellEditor;
    import javax.swing.JComponent;
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableColumn;
     
    class Tableau extends JTable {
     
        private String[] nomCol = {
            "<html><bold><H3>HEURE", "<html><bold><H3>RECETTE",
            "<html><bold><H3>NOMBRE", "<html><bold><H3>RELIQUATS",
            "<html><bold><H3>TOTAL", "<html><bold><H3>NB CONT",
            "<html><bold><H3>NB BU", "<html><bold><H3>GROUPE"                        
        };
        MonModele monModele = new MonModele(29, nomCol);
        DefaultTableCellRenderer custom = new DefaultTableCellRenderer();    
     
        public Tableau(){
     
            this.setModel(monModele);       
     
            this.setFont(new Font("SANS SERIF", Font.BOLD, 16));       
     
            custom.setHorizontalAlignment(JLabel.CENTER);
            for (int i=0 ; i<this.getColumnCount() ; i++) {
            this.getColumnModel().getColumn(i).setCellRenderer(custom);
     
            TableColumn col = this.getColumnModel().getColumn(i);
            col.setCellEditor(new MonTableCellEditor());
     
            col.setPreferredWidth(100);
     
            this.getColumnModel().getColumn(i).setResizable(false);
     
            this.tableHeader.setReorderingAllowed(false);
            }       
     
            this.setRowSelectionAllowed(false);
            this.setRowHeight(28);       
     
            this.setVisible(true);
        }
     
     
        public class MonTableCellEditor extends AbstractCellEditor implements TableCellEditor {
     
            JComponent component = new JTextField();
            @Override
     
            public Component getTableCellEditorComponent(JTable table, Object value,
                    boolean isSelected, int rowIndex, int vColIndex) {
                if (isSelected) {
                }
     
                ((JTextField)component).setText((String)value);
     
                return component;
                }
     
            @Override
            public Object getCellEditorValue() {
                return ((JTextField)component).getText().toUpperCase();
            }
        }
    }
    Classe MonModele :
    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
    mport javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
     
    public class MonModele extends AbstractTableModel implements TableModelListener{
        private int nbLignes;
        private String[] nomCol;
        private MonModele monModele;
     
     
        public MonModele (int nbLignes, String[] nomCol){
            this.nbLignes=nbLignes;
            this.nomCol=nomCol;      
        }
     
        @Override
        public int getColumnCount(){
            return nomCol.length;
        }
     
        @Override
        public int getRowCount() {
            return nbLignes;
        }
     
        @Override
        public Object getValueAt(int ligne, int col) {
            return null;
        }
     
        @Override
        public String getColumnName(int col) {
            return nomCol[col];
        }
     
        @Override
        public boolean isCellEditable(int ligne, int col) {          
            if(col==4 || col==7){
               return false;
            }
            else{
               return true;
            }                    
        }
     
        @Override
        public Class getColumnClass(int c){
            return getValueAt(0, c).getClass();
        }
     
        @Override
        public void tableChanged(TableModelEvent e) {
            int row = e.getFirstRow();
            int column = e.getColumn();
            monModele = (MonModele)e.getSource();
            String columnName = monModele.getColumnName(column);
            Object data = monModele.getValueAt(row, column);
            data = data.toString().toUpperCase();
        }
    }

  2. #22
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Voici la methode getValueAt de ma classe MonModele:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Override
    public Object getValueAt(int ligne, int col) {
    ligne = this.getRowCount();
    col = this.getColumnCount();
    return donnees[ligne][col];
    }
    J'ai l'exception :
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        @Override
        public Class getColumnClass(int c){
            return getValueAt(0, c).getClass();
        }
    le getValueAt(0,c).getClass(); me semble bizarre après c'est peut être voulu. Fais plus simple. Si toutes tes valeurs sont des String, renvoie juste String.class. Si tu as des types différents sur tes colonnes tu fais comme ça :
    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
     
    Class getColumnClass(int col)
    {
    // ici tu fais un switch sur tous les types de colonnes différents
    // dans mon exemple il y a la colonne 0 qui est de type Long, la colonne 2 qui  est de type Date et les autres de types String.
     
      switch(col){
        case 0 :
           return Long.class;
        case 2 :
           return Date.class;
        default: 
           return String.class;
      }
    }
    Adapte l'exemple à ton problèmes maintenant. Je dis pas qu'il faut faire absolument comme j'ai dit mais en tout ce que tu as fait te faire pleins de calculs pour pas grand chose. Je serai prêt à parier n'importe quoi qu'un simple fera très bien ce qu'il faut. Je ne me souviens plus de si on est obligé de surcharger cette méthode. Auquel cas tu n'auras même pas à le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Override
    public Object getValueAt(int ligne, int col) {
    ligne = this.getRowCount();
    col = this.getColumnCount();
    return donnees[ligne][col];
    }
    La méthode getValueAt(int ligne, int col) te renvoie le valeur pour la ligne et la colonne donnée en paramètre. Or toi tu reçois une ligne et une colonne dont tu écrases immédiatement la valeur pour lui donner le nombre de ligne et le nombre de colonne (en gros tu te fiches des paramètres donnés en entrée) et tu renvoies systématiquement la même valeur .

    Ensuite tu fais une donnee[lig][col] avec lig et col étant, très probablement, les dimensions max de ton tableau. ce qui fait que tu tombes toujours à côté. C'est exactement comme tu faisais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int[] tableau=new int[5]{1,2,3,4,5};
    system.out.println(tableau[5]);
    --> index out of bound, crash de l'appli.

    Je ne sais pas d'où vient ton nullpointerexception (il faudrait que tu le précises, car c'est dit dans l'exception) mais c'est quasiment sur et certains que juste après tu auras un arrayindexoutofbound exception.

    pour ton getValueAt(), fais juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String getValueAt(int ligne,int colonne){
    return donnees[ligne][colonne];
    pour ton NullPointer. Dans ton getColumnClass tu appelles getValueAt() or si tu ne mets aucune valeur dans ta table, ou pire si comme j'ai vu plus tot tu remplis ta table qu'avec des valeurs nulles, le getValueAt(0,c) va renvoyer null et donc ton getValueAt(0,c).getClass va crasher , Le getColumnClass est appellé très tot dans la construction de ta table. Donc vraiment corrige le code de ce getColumnClass(). C'est une source d'ennui pour la suite même si ce n'est pas ça qui, aujourd'hui, te provoques une nullpointer.

    Relis bien le tutos de la JTable et même sans passer par le tuto de java qui est un peu indigeste pour un débutant, tu peux en trouver des plus simples sur le net (mais moins complets)



    --------

    concernant l'editor ... quand je t'ai parlé du getCellEditorValue c'était pour répondre à la question du topic "récupérer la valeur saisie dans la JTable".

    Mais que veux tu faire ?
    - vraiment modifier la valeur après saisie ? --> ok tu as bien
    - garder la valeur telle qu'elle est, et juste modifier l'affichage --> utilise plutot un renderer

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut
    t'absuses

    deuxième lien après ceux de java en tapant JTable sur google :
    http://brassens.upmf-grenoble.fr/IMS...SwingTable.htm

    toutes les grosses parties de la JTable sont expliquées avec des exemples en plus

    T'as même un exemple tout fait de tablemodel qui marche pour ton exemple

    edit : ha ! apparament tu as utilisé ce lien car je vois le même getColumnClass(int c) ... il est peut être pas si bien ce lien

  5. #25
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Encore merci pour ces explications.
    Au début j'avais fait :[CODE]@Override
    public Object getValueAt(int ligne, int col) {
    return donnees[ligne][col];
    }[/CODE
    Je croyais que c'était mal et j'avais rajouté les 2 lignes.
    J'ai donc remis comme avant pour suivre tes conseils.

    J'ai également corrigé le getColumnClass:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public Class getColumnClass(int c){
    return String.class;
    }
    Voici le code complet de l'exception (qui arrive au démarrage de l'appli) :
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at MonModele.getValueAt(MonModele.java:51)
    at javax.swing.JTable.getValueAt(JTable.java:2639)
    at javax.swing.JTable.prepareRenderer(JTable.java:5653)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974)
    at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1770)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
    at javax.swing.JComponent.paintComponent(JComponent.java:763)
    at javax.swing.JComponent.paint(JComponent.java:1027)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JViewport.paint(JViewport.java:747)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5129)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
    at javax.swing.JComponent.paint(JComponent.java:1013)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
    at java.awt.Container.paint(Container.java:1797)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:734)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

  6. #26
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Du nouveau :
    j'ai initialisé les "rows" dans la classe Tableau.
    C'est ça qui faisait planter et je cherchais l'erreur dans la classe MonModele.
    Merci kisame pour les indications.

    Autre chose :
    j'ai implémenté la méthode tableChanged dans Tableau car avant elle était dans MonModele.
    Par contre j'ai de nouveau une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
        public void tableChanged(TableModelEvent e) {
            int row = e.getFirstRow();
            int column = e.getColumn();
            monModele = (MonModele)e.getSource();  // ligne qui provoque l'erreur
            String columnName = monModele.getColumnName(column);
            Object data = monModele.getValueAt(row, column);
            data = data.toString().toUpperCase();
        }
    Message d'erreur :
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.table.DefaultTableModel cannot be cast to MonModele

    Je patauge complètement. C'est de pire en pire.

  7. #27
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Je pense que je dois lui indiquer que MonModele est mon modèle par défaut mais je ne vois pas comment faire.

  8. #28
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Problème résolu.
    Après de nombreuses recherches et autant d'essais, j'ai viré la méthode tableChanged et j'ai ajouté la méthode setValueAt dans la classe MonModele.

    Encore un grand merci pour les indications.

  9. #29
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Edit : trompé de topic.i.

  10. #30
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Par contre je voudrais un traitement différent selon la colonne :
    Si telle colonne -> mettre en majuscules.
    Si autre -> vérifier si la saisie est ok (ex: compatible avec le type "heure").
    si encore autre -> ouvrir fichier et vérifier si la saisie correspond à une référence.
    etc ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Récupérer valeur cellule Jtable
    Par Sun03 dans le forum Composants
    Réponses: 1
    Dernier message: 06/04/2011, 09h32
  2. Récupérer valeur cellule dans classeur
    Par ericdev67 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 17/03/2008, 00h54
  3. Comment récupérer valeur cellule d'un gridview?
    Par cortex024 dans le forum ASP.NET
    Réponses: 9
    Dernier message: 23/03/2007, 14h31
  4. [VBA-E]Récupérer valeur cellule
    Par wanou44 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 06/02/2006, 12h52
  5. [POI]Récupérer valeur cellule suivant format
    Par leminipouce dans le forum Documents
    Réponses: 1
    Dernier message: 27/10/2005, 08h52

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