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 :

Ajouter ligne à JTable héritée d'AbstractTableModel


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut Ajouter ligne à JTable héritée d'AbstractTableModel
    Bonjour,

    Je me lance dans le développement java, et je rencontre un problème surement simple mais auquel je n'ai trouvé aucune solution concrète.
    J'ai une JTable composée de 2 colonnes (string, bool) que je rempli avec des données venant d'une table. Jusque là pas de soucis, mais j'aimerais qu'au clique d'un bouton, une ligne s'ajoute en première position dans ma table.

    voilà l'instanciation de ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jtCateg = new JTable(new MyTableModel());
            jtCateg.setSize(new Dimension(50, 20));
            panDetail.add(jtCateg);
    Ici ma classe héritant de AbstractTableModel
    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
    class MyTableModel extends AbstractTableModel {
            private Class[] columnTypes = new Class[] {
                    String.class, Boolean.class
                };
            private String[] columnNames={"Catégorie","Sélection"}; 
            private Object[][] data = movie.getCateg();
            //constructeur
            public MyTableModel(){
     
            }
            public void addRow(Object[] rowData){
              //ici je bloque
            }
            //retourne le nombre de colonne
            public int getColumnCount() {
                return columnNames.length;
            }
            //retourne le nombre de ligne
            public int getRowCount() {
                return data.length;
            }
            //retourne le nom de la colonne dont l'indice est donné en paramètre
            public String getColumnName(int col) {
                return columnNames[col];
            }
            //initialise la valeur d'une cellule dont les coordonnées sont passés en paramètre
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
            //retourne le type de la colonne
            public Class getColumnClass(int c) {
                //return getValueAt(0, c).getClass();
                return columnTypes[c];
            }
            public boolean isCellEditable(int row, int col) {
                    return true;
            }
        }
    Et pour finir le bouton qui déclenchera l'ajout de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    btAddCateg.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    //appel pour l'ajout de la line
                }
            });
    Voilà mon problème est en fait de savoir comment ajouter une ligne vide à mon tableau contenant les data ? Ce qui ajoutera la ligne sans pour autant recharger mes données?

    De plus est-ce qu'il y a un événement qui se déclenche au changement de ligne après avoir été en édition pour sauver en DB les éventuels changements?

    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Pour ajouter une ligne dans le Tablemodel, il faut avoir une structure modifiable (p.ex. une "java.util.List"), ce qui n'est pas le cas pour le tableau ("array") que tu utilise actuellement. Après l'ajout d'un élément de ligne dans la liste, il ne faut pas oublier d'appeler la méthode "fireTableRowsInserted" pour déclencher la mise à jour de l'affichage.

    Après l'édition d'une cellule, c'est la méthode "setValueAt" du Tablemodel qui est appelée. Tu peux donc facilement réagir dans cette méthode pour mettre à jour la base de données.

    Cordialement,
    André

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    Bonjour,

    Voilà j'ai avancé et j'ai suivi votre conseil d'utiliser une arraylist mais j'ai encore quelques soucis. Ma grille s'affiche bien avec les données mais
    1) l'header a disparu
    2) la seconde colonne qui était un checkbox est maintenant redevenu une simple string.
    3) Comment faire pour qu'au moment où j'ajoute une ligne, il la mette au début de mon arraylist et pas à la fin

    Pouvez vous me dire ce que je fais de mal

    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
    ArrayList<String> header = new ArrayList<String>(
    	    	    Arrays.asList("Catégorie", "Sélection"));
     
    	    //crée le modèle utilisé pour jtable
    	    final MyTableModel customModel = new MyTableModel(movie.getCateg(),header);
    		jtCateg = new JTable(customModel);
     
    JButton btAddCateg = new JButton("");
    		btAddCateg.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				Object[] row = new Object[2];
    		    	row[0] = "";
    		    	row[1] = true;
    				customModel.addRow(row);
    			}
    		});
     
    class MyTableModel extends AbstractTableModel {
    		//list contanant les données
    	    private ArrayList<Object[]> rows;
    	    //list contenant l'entete
    	    private ArrayList<String> header;
    		private Class[] columnTypes = new Class[] {
    				String.class, Boolean.class
    			};
    	    private String[] columnNames={"Catégorie","Sélection"}; 
    	    public MyTableModel(ArrayList<Object[]> data,ArrayList<String> header){
    	        this.rows = data;
    	        this.header = header;
    	    }
    	    public void addRow(Object[] row) {
    	    	//ici j'ajoute à ma list mais à la fin
    	    	rows.add(row);
    	    	fireTableDataChanged();
    	    }
    	    public int getColumnCount(){
    	        return header.size();
    	    }
    	    public int getRowCount() {
    	        return rows.size();
    	    }
    	    public String getColumnName(int col){
    	    	//le nom de mes entetes est bien correct ainsi que le nombre d'éléments
    	    	System.out.println(header.get(col).toString()+"&&"+header.size());
    	        return header.get(col).toString();
    	    }
    	    public Object getValueAt(int row, int col){
    	    	return rows.get(row)[col];
    	    }
    	    public boolean isCellEditable(int row, int col){
    	    	return true; 
    	    }
    	    // Don't need to implement this method unless your table's
    	    // data can change.
    	   /* public void setValueAt(Object value, int row, int col){
    	        ArrayList v = (ArrayList) rows.get(row);
    	        v.remove(col);
    	        v.add(col, value);
    	        fireTableCellUpdated(row, col);
    	    }*/
    	}
    Merci de votre aide

  4. #4
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Essaie avec ceci:

    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
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;
    import javax.swing.*;
    import javax.swing.table.*;
     
    public class MyTableModel extends AbstractTableModel {
     
        private List<Object[]> rows;
        private Class[] columnTypes = new Class[]{
            String.class, Boolean.class
        };
        private String[] columnNames = {"Catégorie", "Sélection"};
     
        public MyTableModel(List<Object[]> data) {
            this.rows = data;
        }
     
        public void addRow(Object[] row) {
            rows.add(0, row);
            fireTableRowsInserted(0, 0);
        }
     
        @Override
        public int getColumnCount() {
            return columnNames.length;
        }
     
        @Override
        public int getRowCount() {
            return rows.size();
        }
     
        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }
     
        @Override
        public Object getValueAt(int row, int col) {
            return rows.get(row)[col];
        }
     
        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            rows.get(rowIndex)[columnIndex] = aValue;
        }
     
        @Override
        public boolean isCellEditable(int row, int col) {
            return true;
        }
     
        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return columnTypes[columnIndex];
        }
    }
    Cordialement,
    André

    PS: pour avoir les entêtes de colonne, il faut mettre la JTable dans un JScrollPane: panDetail.add(new JScrollPane(jtCateg));

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    Merci pour votre réponse

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

Discussions similaires

  1. ajout / suppression des ligne à JTable
    Par sky88 dans le forum Débuter
    Réponses: 3
    Dernier message: 28/08/2008, 22h21
  2. suppr/ajout ligne à un JTable
    Par monpseudonom dans le forum Débuter
    Réponses: 6
    Dernier message: 10/04/2008, 12h44
  3. Ajouter une ligne à JTable
    Par ShredLord dans le forum Composants
    Réponses: 1
    Dernier message: 13/11/2007, 22h15
  4. [JTable] Ajout ligne
    Par rems033 dans le forum Composants
    Réponses: 1
    Dernier message: 09/08/2007, 10h41
  5. Réponses: 15
    Dernier message: 09/06/2006, 12h13

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