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 :

Cases à cocher ne répondent pas dans JTable


Sujet :

Composants Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut Cases à cocher ne répondent pas dans JTable
    Bonjour

    J'ai créé une application qui récupère des données provenant d'une base de données Mysql et les affichent dans une JTable. J'ai ensuite ajouté des checkbox dans la 1ère colonne mais malheureusement celles-ci ne répondent pas, c'est-à-dire que quand je clique dessus,les checkbox ne sont pas cochées. Voici le 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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    public class PanListerUser extends JPanel{
     
    public PanListerUser()
        { try {
                            Class.forName("com.mysql.jdbc.Driver");
                        } catch (ClassNotFoundException ex) {
                            //JOptionPane.showMessageDialog(null,ex.getMessage());
                           JOptionPane.showMessageDialog(null,"Impossible de charger le pilote!"+ex.getMessage());
                            //JOptionPane.showMessageDialog(null,"Impossible de charger le pilote!");
                        }
     
                     try {
                con = (java.sql.Connection) DriverManager.getConnection(url, user, passwd);
     
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null,"Impossible d'établir la connexion!"+ex.getMessage());
            }
        actualiser();
        }
     
     public void actualiser()
       {
     
     
            btModifier.setBounds(50,325 , 150, 30);
             this.add(btModifier);
     
             btSupprimer.setBounds(240,325 , 150, 30);
             this.add(btSupprimer);
     
             labResult = new JLabel("ttt");
             labResult.setBounds(0,290 , 550, 30);
             this.add(labResult);
     
           this.setBackground(Color.yellow);
           this.setLayout(null);
             tableau = new JTable();
                      panotable = new JPanel();
     
     
                try {
                    String requete = null;
                   requete="select * from user ";
                             //Création d'un objet Statement
                               long start = System.currentTimeMillis();
                               state = con.createStatement();
                             //L'objet ResultSet contient le résultat de la requête SQL
                               res = state.executeQuery(requete);
                             //On récupère les MetaData
                               resultMeta = res.getMetaData();
     
                               //On récupère les meta afin de récupérer le nom des colonnes
                                ResultSetMetaData meta = res.getMetaData();
                                int nbrCol = meta.getColumnCount();
     
                                System.out.println("le nombre de colonne est: "+nbrCol);
     
                                //On initialise un tableau d'Object pour les en-têtes du tableau
                                String[] column = new String[nbrCol+1];
     
                                column[0] = "Case à cocher";
                                for(int i = 1 ; i <= nbrCol; i++)
                                column[i] = meta.getColumnName(i);
     
                                //Petite manipulation pour obtenir le nombre de lignes
                                res.last();
                                int rowCount = res.getRow();
     
                                Object[][] data = new Object[rowCount][nbrCol+1];
     
                                //On revient au départ
                                res.beforeFirst();
                                System.out.println("le nombre de ligne est: "+rowCount);
                                int j = 0;
                                //On remplit le tableau d'Object[][]
                                while(res.next()){
                                    data[j][0] = new Boolean(false);
     
                                    for(int i = 1 ; i <= meta.getColumnCount(); i++)
                                    {
                                    data[j][i] = res.getObject(i);
                                    }
                                    j++;                           
                                }
     
                                //On ferme le tout
                                res.close();
                                state.close();
                                long totalTime = System.currentTimeMillis() - start;
     
                                labResult.setText("La requête à été exécutée en "+totalTime+ " ms et a retourné " + rowCount + " ligne(s)");
     
                panotable.setLayout(null);
                panotable.setBounds(0,0 , 574, 300);
                //panotable.setLayout(new BorderLayout());
                ZModel model = new ZModel(data, column);
     
                            this.tableau = new JTable(model);
                            this.tableau.setDefaultRenderer(JComponent.class, new TableComponent());
     
            //JScrollPane
            js = new JScrollPane(tableau);
        //  js.setPreferredSize(new Dimension(50,50));
             js.setBounds(0,0,566,300);
            panotable.removeAll();
            panotable.add(js,BorderLayout.CENTER );
            panotable.repaint();
     
     
            this.add(panotable);
     
     
     
                         } catch (SQLException ex) {
                             JOptionPane.showMessageDialog(null,"Erreur"+ex);
                         }
     
     
       }
     
     
     //Classe modèle personnalisée
     
      class ZModel extends AbstractTableModel{
     
        private Object[][] data;
     
        private String[] title;
     
     
        //Constructeur
     
        public ZModel(Object[][] data, String[] title){
     
          this.data = data;
     
          this.title = title;
     
        }
     
     
        //Retourne le nombre de colonnes
     
        public int getColumnCount() {
     
          return this.title.length;
     
        }
     
     
        //Retourne le nombre de lignes
     
        public int getRowCount() {
     
          return this.data.length;
     
        }
     
     
        //Retourne la valeur à l'emplacement spécifié
     
        public Object getValueAt(int row, int col) {
     
          return this.data[row][col];
     
        }
     
        /**
     
    * Retourne le titre de la colonne à l'indice spécifié
     
    */
     
    public String getColumnName(int col) {
     
      return this.title[col];
     
    }
     
    //Retourne la classe de la donnée de la colonne
     
    public Class getColumnClass(int col){
     
      //On retourne le type de la cellule à la colonne demandée
     
      //On se moque de la ligne puisque les types de données sont les mêmes quelle que soit la ligne
     
      //On choisit donc la première ligne
     
      return this.data[0][col].getClass();
     
    }
     
    //Retourne vrai si la cellule est éditable : celle-ci sera donc éditable
     
    public boolean isCellEditable(int row, int col){
     
      //On appelle la méthode getValueAt qui retourne la valeur d'une cellule
     
      //Et on effectue un traitement spécifique si c'est un JButton
     
      if(getValueAt(0, col) instanceof JButton)
     
        return false;
     
      return true;
     
    }
     
      }
    //CTRL + SHIFT + O pour générer les imports
     
    public class TableComponent extends DefaultTableCellRenderer {
     
     
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
     
        if (value instanceof JButton)
     
          return (JButton) value;
     
        //Lignes ajoutées
     
        else if(value instanceof JComboBox)
     
          return (JComboBox) value;
     
        else if(value instanceof JCheckBox)
     
          return (JCheckBox) value;
     
        else
     
          return this;
     
      }
     
    }
     
    }
    Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ce n'est pas du tout comme ça qu'on gère la "saisie" dans une JTable, y compris les intéractions avec des boutons. Le TableCellRenderer est là pour faire du rendu (comme son nom l'indique) : il est juste utilisé pour produit une "image" de la cellule, ce qu'il faut afficher dans celle-ci. Aussi il n'existe qu'une seule instance de renderer, donc ça n'aurait aucun sens de pouvoir avoir un seule unique bouton ou checkbox dans plusieurs lignes à la fois.

    Pour faire ce genre de chose, on utilise un TableCellEditor.

    A noter, que la JTable gère déjà un TableCellEditor par défaut qui gère les booléens par checkbox.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Ok je vois. J'ai pu implémenter la classe TableCellEditor, maintenant j'arrive à cocher les checkbox mais j'ai un nouveau problème. En effet mes cases à cocher agissent comme des boutons radios, c'est-à-dire que quand je coche le 1er checkbox et que je clique sur le 2e, le 1er se décoche automatiquement. Voici la class qui implémente TableCellEditor:

    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
    public class CheckBoxCellEditor  extends AbstractCellEditor implements TableCellEditor { 
     
        protected JCheckBox checkBox;
     
            public CheckBoxCellEditor() {
                checkBox = new JCheckBox();
                checkBox.setHorizontalAlignment(SwingConstants.CENTER);           
            }
     
            public Component getTableCellEditorComponent(
                    JTable table, 
                    Object value, 
                    boolean isSelected, 
                    int row, 
                    int column) {
     
               checkBox.setSelected(((Boolean) value).booleanValue());
     
                return checkBox;
            }
            public Object getCellEditorValue() {
                return Boolean.valueOf(checkBox.isSelected());
            }
    }
    Et voici l'appel à la classe CheckBoxCellEditor:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ZModel model = new ZModel(data, column);
     
                            this.tableau = new JTable(model);
                            this.tableau.setDefaultRenderer(JComponent.class, new TableComponent());
                            this.tableau.getColumnModel().getColumn(2).setCellRenderer(new BoldCellRenderer());
                            this.tableau.setDefaultEditor(Boolean.class, new CheckBoxCellEditor());
    Merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ce n'est pas à toi de gérer la checkbox, c'est la table qui doit pouvoir.

    Le plus simple est que la méthode getColumnClass du modèle retourne Boolean.class pour la/les colonne/s voulue/s. La JTable prendra un éditeur avec checkbox (et un rendeder).

    Si tu veux faire ton propre éditeur, inspire-toi du code de la JTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class BooleanEditor extends DefaultCellEditor {
            public BooleanEditor() {
                super(new JCheckBox());
                JCheckBox checkBox = (JCheckBox)getComponent();
                checkBox.setHorizontalAlignment(JCheckBox.CENTER);
            }
        }
    Tu peux redéfinir getTableCellEditorComponent mais uniquement pour du rendu (ne pas sélectionner ou désectionner).

    Tu as ici un exemple particulier : https://www.developpez.net/forums/d1...ckboxrenderer/
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Ok je vois. Maintenant j'ai une autre question. J'ai téléchargé un exemple sur ce lien:

    https://docs.oracle.com/javase/tutor...ctionDemo.java

    J'ai essayé d'adapter ce code à mon application, et finalement tout marche comme je le souhaite et cela,sans implémenter le TableCelEditor:

    Voici le code que j'ai téléchargé:

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    package components;
     
    /*
     * TableSelectionDemo.java requires no other files.
     */
     
    import javax.swing.*;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.GridLayout;
    import java.awt.Dimension;
     
    public class TableSelectionDemo extends JPanel 
                                    implements ActionListener { 
        private JTable table;
        private JCheckBox rowCheck;
        private JCheckBox columnCheck;
        private JCheckBox cellCheck;
        private ButtonGroup buttonGroup;
        private JTextArea output;
     
        public TableSelectionDemo() {
            super();
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
     
            table = new JTable(new MyTableModel());
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);
            table.getSelectionModel().addListSelectionListener(new RowListener());
            table.getColumnModel().getSelectionModel().
                addListSelectionListener(new ColumnListener());
            add(new JScrollPane(table));
     
            add(new JLabel("Selection Mode"));
            buttonGroup = new ButtonGroup();
            addRadio("Multiple Interval Selection").setSelected(true);
            addRadio("Single Selection");
            addRadio("Single Interval Selection");
     
            add(new JLabel("Selection Options"));
            rowCheck = addCheckBox("Row Selection");
            rowCheck.setSelected(true);
            columnCheck = addCheckBox("Column Selection");
            cellCheck = addCheckBox("Cell Selection");
            cellCheck.setEnabled(false);
     
            output = new JTextArea(5, 40);
            output.setEditable(false);
            add(new JScrollPane(output));
        }
     
        private JCheckBox addCheckBox(String text) {
            JCheckBox checkBox = new JCheckBox(text);
            checkBox.addActionListener(this);
            add(checkBox);
            return checkBox;
        }
     
        private JRadioButton addRadio(String text) {
            JRadioButton b = new JRadioButton(text);
            b.addActionListener(this);
            buttonGroup.add(b);
            add(b);
            return b;
        }
     
        public void actionPerformed(ActionEvent event) {
            String command = event.getActionCommand();
            //Cell selection is disabled in Multiple Interval Selection
            //mode. The enabled state of cellCheck is a convenient flag
            //for this status.
            if ("Row Selection" == command) {
                table.setRowSelectionAllowed(rowCheck.isSelected());
                //In MIS mode, column selection allowed must be the
                //opposite of row selection allowed.
                if (!cellCheck.isEnabled()) {
                    table.setColumnSelectionAllowed(!rowCheck.isSelected());
                }
            } else if ("Column Selection" == command) {
                table.setColumnSelectionAllowed(columnCheck.isSelected());
                //In MIS mode, row selection allowed must be the
                //opposite of column selection allowed.
                if (!cellCheck.isEnabled()) {
                    table.setRowSelectionAllowed(!columnCheck.isSelected());
                }
            } else if ("Cell Selection" == command) {
                table.setCellSelectionEnabled(cellCheck.isSelected());
            } else if ("Multiple Interval Selection" == command) { 
                table.setSelectionMode(
                        ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                //If cell selection is on, turn it off.
                if (cellCheck.isSelected()) {
                    cellCheck.setSelected(false);
                    table.setCellSelectionEnabled(false);
                }
                //And don't let it be turned back on.
                cellCheck.setEnabled(false);
            } else if ("Single Interval Selection" == command) {
                table.setSelectionMode(
                        ListSelectionModel.SINGLE_INTERVAL_SELECTION);
                //Cell selection is ok in this mode.
                cellCheck.setEnabled(true);
            } else if ("Single Selection" == command) {
                table.setSelectionMode(
                        ListSelectionModel.SINGLE_SELECTION);
                //Cell selection is ok in this mode.
                cellCheck.setEnabled(true);
            }
     
            //Update checkboxes to reflect selection mode side effects.
            rowCheck.setSelected(table.getRowSelectionAllowed());
            columnCheck.setSelected(table.getColumnSelectionAllowed());
            if (cellCheck.isEnabled()) {
                cellCheck.setSelected(table.getCellSelectionEnabled());
            }
        }
     
        private void outputSelection() {
            output.append(String.format("Lead: %d, %d. ",
                        table.getSelectionModel().getLeadSelectionIndex(),
                        table.getColumnModel().getSelectionModel().
                            getLeadSelectionIndex()));
            output.append("Rows:");
            for (int c : table.getSelectedRows()) {
                output.append(String.format(" %d", c));
            }
            output.append(". Columns:");
            for (int c : table.getSelectedColumns()) {
                output.append(String.format(" %d", c));
            }
            output.append(".\n");
        }
     
        private class RowListener implements ListSelectionListener {
            public void valueChanged(ListSelectionEvent event) {
                if (event.getValueIsAdjusting()) {
                    return;
                }
                output.append("ROW SELECTION EVENT. ");
                outputSelection();
            }
        }
     
        private class ColumnListener implements ListSelectionListener {
            public void valueChanged(ListSelectionEvent event) {
                if (event.getValueIsAdjusting()) {
                    return;
                }
                output.append("COLUMN SELECTION EVENT. ");
                outputSelection();
            }
        }
     
        class MyTableModel extends AbstractTableModel {
            private String[] columnNames = {"First Name",
                                            "Last Name",
                                            "Sport",
                                            "# of Years",
                                            "Vegetarian"};
            private Object[][] data = {
            {"Kathy", "Smith",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"John", "Doe",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Sue", "Black",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Jane", "White",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Joe", "Brown",
             "Pool", new Integer(10), new Boolean(false)}
            };
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
     
            /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell.  If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than a check box.
             */
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
     
            /*
             * Don't need to implement this method unless your table's
             * editable.
             */
            public boolean isCellEditable(int row, int col) {
                //Note that the data/cell address is constant,
                //no matter where the cell appears onscreen.
                if (col < 2) {
                    return false;
                } else {
                    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) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
     
        }
     
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Disable boldface controls.
            UIManager.put("swing.boldMetal", Boolean.FALSE); 
     
            //Create and set up the window.
            JFrame frame = new JFrame("TableSelectionDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            //Create and set up the content pane.
            TableSelectionDemo newContentPane = new TableSelectionDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
     
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
     
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    Et voici comment je l'ai adapté à mon application:

    Class MyTableModel.java

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package gesstock;
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
    import javax.swing.JOptionPane;
    import javax.swing.table.AbstractTableModel;
     
    /**
     *
     * @author Mo
     */
    public class MyTableModel extends AbstractTableModel {
         private String url="jdbc:mysql://localhost:3306/gesentrep_db";
        private String user = "root";
        private String passwd = "passer";
        private Connection con;
        private ResultSet res;
        private Statement state;
        private ResultSetMetaData resultMeta;
            private String[] columnNames ;
            private Object[][] data ;
     
            public MyTableModel ()
            {
            try {
                            Class.forName("com.mysql.jdbc.Driver");
                        } catch (ClassNotFoundException ex) {
                            //JOptionPane.showMessageDialog(null,ex.getMessage());
                           JOptionPane.showMessageDialog(null,"Impossible de charger le pilote!"+ex.getMessage());
                            //JOptionPane.showMessageDialog(null,"Impossible de charger le pilote!");
                        }
     
                     try {
                con = (java.sql.Connection) DriverManager.getConnection(url, user, passwd);
     
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null,"Impossible d'établir la connexion!"+ex.getMessage());
            }
                     try {
                     String requete = null;
                   requete="select * from user ";
                             //Création d'un objet Statement
                               long start = System.currentTimeMillis();
                               state = con.createStatement();
                             //L'objet ResultSet contient le résultat de la requête SQL
                               res = state.executeQuery(requete);
                             //On récupère les MetaData
                               resultMeta = res.getMetaData();
     
                               //On récupère les meta afin de récupérer le nom des colonnes
                                ResultSetMetaData meta = res.getMetaData();
                                int nbrCol = meta.getColumnCount();
     
                                System.out.println("le nombre de colonne est: "+nbrCol);
     
                                //On initialise un tableau d'Object pour les en-têtes du tableau
                                String[] column = new String[nbrCol+1];
     
                                column[0] = "Case à cocher";
                                for(int i = 1 ; i <= nbrCol; i++)
                                column[i] = meta.getColumnName(i);
     
                                //Petite manipulation pour obtenir le nombre de lignes
                                res.last();
                                int rowCount = res.getRow();
     
                                Object[][] data1 = new Object[rowCount][nbrCol+1];
     
                                //On revient au départ
                                res.beforeFirst();
                                System.out.println("le nombre de ligne est: "+rowCount);
                                int j = 0;
                                //On remplit le tableau d'Object[][]
                                while(res.next()){
                                    data1[j][0] = new Boolean(false);
     
                                    for(int i = 1 ; i <= meta.getColumnCount(); i++)
                                    {
                                    data1[j][i] = res.getObject(i);
                                    }
                                    j++;                            
                                } 
     
                                columnNames = column;
                                data = data1;
     
                     } catch (SQLException ex) {
                             JOptionPane.showMessageDialog(null,"Erreur"+ex);
                         }
     
     
            }
     
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
     
            /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell.  If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than a check box.
             */
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
     
            /*
             * Don't need to implement this method unless your table's
             * editable.
             */
            public boolean isCellEditable(int row, int col) {
                //Note that the data/cell address is constant,
                //no matter where the cell appears onscreen.
                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) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
     
        }
    Class PanListerUSer.java

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package gesstock;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
    import javax.swing.AbstractCellEditor;
    import javax.swing.BorderFactory;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JComponent;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingConstants;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;
     
    /**
     *
     * @author Mo
     */
    public class PanListerUser extends JPanel {
     
        private JTable tableau;
        private JPanel panotable = null;
        private JScrollPane js= null;
        private JLabel labResult = null;
     
        JButton btModifier = new JButton("Modifier");
        JButton btSupprimer = new JButton("Supprimer");
     
        public PanListerUser()
        {
     
        actualiser();
        }
     
        public void actualiser()
       { 
     
     
            btModifier.setBounds(50,325 , 150, 30);
             this.add(btModifier);
     
             btSupprimer.setBounds(240,325 , 150, 30);
             this.add(btSupprimer);
     
             labResult = new JLabel("ttt");
             labResult.setBounds(0,290 , 550, 30);
             this.add(labResult);
     
           this.setBackground(Color.decode("#e1e1b8"));
           this.setLayout(null);
             tableau = new JTable();
                      panotable = new JPanel();
     
     
     
     
    			panotable.setLayout(null);
    			panotable.setBounds(0,0 , 574, 300);
    			//panotable.setLayout(new BorderLayout());
     
     
                            this.tableau = new JTable(new MyTableModel());
                         //  this.tableau.setDefaultRenderer(JComponent.class, new TableComponent());
                           // this.tableau.getColumnModel().getColumn(2).setCellRenderer(new BoldCellRenderer());
                            //this.tableau.setDefaultEditor(Boolean.class, new BooleanCellEditor());
     
    		//JScrollPane
    		js = new JScrollPane(tableau);
    	//	js.setPreferredSize(new Dimension(50,50));
    		 js.setBounds(0,0,566,300);
    		panotable.removeAll();
    		panotable.add(js,BorderLayout.CENTER );
    		panotable.repaint();
     
     
    		this.add(panotable);
     
       }
     
    }
    Ca veut dire que l'implémentation du TableCellEditor n'est pas nécessaire?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par momjunior Voir le message
    Ca veut dire que l'implémentation du TableCellEditor n'est pas nécessaire?
    Oui, c'est ce que je t'avais dit au début :
    Citation Envoyé par joel.drigo Voir le message
    A noter, que la JTable gère déjà un TableCellEditor par défaut qui gère les booléens par checkbox.
    PS: merci de répondre dans ta discussion et non pas dans celles dont je te donne le lien à suivre pour exemple.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/04/2015, 14h44
  2. Réponses: 3
    Dernier message: 05/05/2014, 12h28
  3. case à cocher ne marche pas
    Par Invité dans le forum Word
    Réponses: 1
    Dernier message: 09/11/2012, 20h27
  4. case à cocher pour valeur boolean dans un jtable
    Par robert_trudel dans le forum Composants
    Réponses: 2
    Dernier message: 08/11/2009, 22h16
  5. Réponses: 6
    Dernier message: 08/04/2008, 13h17

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