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 :

Checkbox dans une JTable


Sujet :

Composants Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 68
    Points : 42
    Points
    42
    Par défaut Checkbox dans une JTable
    Bonjour,

    Je viens enfin de réussir créer mon AbstractTableModel associé avec ma collection (non sans mal). Sauf que voilà je souhaiterais rajouter une colonne avec des Checkbox pour chaque ligne et je galère un peu ...

    Voilà ma classe :
    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
     
    import javax.swing.table.AbstractTableModel;
     
    public class ModelJtable extends AbstractTableModel {
    	private Contact[] MesContacts = new Contact[] {};
        private String[] entetes = {"Prénom", "Nom", "Société", "E-mail"};
     
        public ModelJtable() {
            super();
            MesContacts = Annuaire.MesContacts;
        }
     
        public int getRowCount() {
            return MesContacts.length;
        }
     
        public int getColumnCount() {
            return entetes.length;
        }
     
        public String getColumnName(int columnIndex) {
            return entetes[columnIndex];
        }
     
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch(columnIndex){
                case 0:
                    return MesContacts[rowIndex].getPrenom();
                case 1:
                    return MesContacts[rowIndex].getNom();
                case 2:
                    return MesContacts[rowIndex].getSociete();
                case 3:
                    return MesContacts[rowIndex].getEmail();
                default:
                    return null; //Ne devrait jamais arriver
            }
        }
    }
    Pour infos Annuaire.MesContacts c'est mon tableau de contact que j'ai passé en static.

    Voilà si quelqu'un pourrait me filer un coup de main. Merci beaucoup

  2. #2
    Membre éprouvé
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Points : 1 034
    Points
    1 034
    Par défaut
    Il suffit de surcharger la méthode public Class<?> getColumnClass(int columnIndex) pour qu'elle renvoie Boolean.class pour la colonne pour la quelle tu veux afficher une CheckBox, quand le DefaultTableRenderer rencontre une valeur de type Boolean il la dessine automatiquement en Checkbox. J'ai essayé d'adapté ta solution en ajoutant une colonne Selectionee et une nouvelle variable tableau lignessSelectionnees qui te permet de savoir quelles lignes sont cochées. Comme 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
    public class ModelJtable extends AbstractTableModel {
    	private Contact[] MesContacts = new Contact[] {};
        private String[] entetes = {"Prénom", "Nom", "Société", "E-mail","selectionnee"};
        private boolean[] lignesSelectionnees;
        
        public ModelJtable() {
            super();
            MesContacts = Annuaire.MesContacts;
            lignesSelectionnees = new boolean[MesContacts.length];
        }
     
        public int getRowCount() {
            return MesContacts.length;
        }
     
        public int getColumnCount() {
            return entetes.length;
        }
        
        public Class<?> getColumnClass(int columnIndex) {
        	if (columnIndex == 4) return Boolean.class;
        	else return String.class;
        }
     
        public String getColumnName(int columnIndex) {
            return entetes[columnIndex];
        }
     
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch(columnIndex){
                case 0:
                    return MesContacts[rowIndex].getPrenom();
                case 1:
                    return MesContacts[rowIndex].getNom();
                case 2:
                    return MesContacts[rowIndex].getSociete();
                case 3:
                    return MesContacts[rowIndex].getEmail();
                case 4:
                	return lignesSelectionnees[rowIndex];
                default:
                    return null; //Ne devrait jamais arriver
            }
        }
    }
    Bon courage.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Wahou ca fonctionne à merveille à un petit détail pret, ma checkbox ne se coche pas lorsque que je clique dessus

  4. #4
    Membre éprouvé
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Points : 1 034
    Points
    1 034
    Par défaut
    C'est normal. C'est parceque la méthode isCellEditable de AbstractTableModel retourne toujours false. Tu dois la surcharger et retourner true. En plus tu dois surcharger la méthode SetValueAt pour persister les changements que tu as fait dans le nouveau tableau lignesSelectionnées. En ajoutant ce code à ton ModelJtable 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    	public boolean isCellEditable(int rowIndex, int columnIndex) {
    		return true;
    	}
     
    	public void setValueAt(Object value, int rowIndex, int columnIndex) {
    		switch (columnIndex) {
    		case 0:
    			MesContacts[rowIndex].setPrenom((String) value);
    			break;
    		case 1:
    			MesContacts[rowIndex].setNom((String) value);
    			break;
    		case 2:
    			MesContacts[rowIndex].setSociete((String) value);
    			break;
    		case 3:
    			MesContacts[rowIndex].setEmail((String) value);
    			break;
    		case 4:
    			lignesSelectionnees[rowIndex] = (Boolean) value;
    			break;
    		}
    	}
    Bon courage.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup. Est ce que je peux te demander un dernier ptit truc, j'aimerais en fait récupérer les emails de chaque ligne coché, dans un tableau ou une arrayList par exemple.

  6. #6
    Membre éprouvé
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Points : 1 034
    Points
    1 034
    Par défaut
    Il te suffit de parcourir ton tableau lignesSelectionnees. ET à chaque fois que tu trouve true c'est une ligne coché. Par exemple pour afficher tout les mails des lignes cochées, tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i=0;i<lignesSelectionnees.length;i++) {
        if (lignesSelectionnees[i]) {
            System.out.println(MesContacts[i].getEmail());
        }
    }
    à toi d'adapter ça pour récuperer les mails des lignes cochées dans un arrayList.

    Bon courage.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Ah c'est si simple que ca.
    Encore merci pour toute ton aide et bonne continuation

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Finalement j'ai un nouveau petit soucis, lorsque je coche une checkbox ca me renvoi toujours false

    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
     
    import javax.swing.table.AbstractTableModel;
     
    public class ModelJtable extends AbstractTableModel {
    	private Contact[] MesContacts = new Contact[] {};
        private String[] entetes = {"Prénom", "Nom", "Société", "E-mail", "Mailer"};
        public boolean[] lignesSelectionnees;
     
        public ModelJtable() {
            super();
            MesContacts = Annuaire.MesContacts;
            lignesSelectionnees = new boolean[MesContacts.length];
            afficher_email();
        }
     
        public int getRowCount() {
            return MesContacts.length;
        }
     
        public int getColumnCount() {
            return entetes.length;
        }
     
        public Class<?> getColumnClass(int columnIndex) {
        	if (columnIndex == 4)
        		return Boolean.class;
        	else
        		return String.class;
        }
     
        public String getColumnName(int columnIndex) {
            return entetes[columnIndex];
        }
     
    	public boolean isCellEditable(int rowIndex, int columnIndex) {
    		return true;
    	}
     
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch(columnIndex){
                case 0:
                    return MesContacts[rowIndex].getPrenom();
                case 1:
                    return MesContacts[rowIndex].getNom();
                case 2:
                    return MesContacts[rowIndex].getSociete();
                case 3:
                    return MesContacts[rowIndex].getEmail();
                case 4:
                	return lignesSelectionnees[rowIndex];
                default:
                    return null; //Ne devrait jamais arriver
            }
    	}	
     
        public void setValueAt(Object value, int rowIndex, int columnIndex) {
    		switch (columnIndex) {
    		case 0:
    			MesContacts[rowIndex].setPrenom((String) value);
    			break;
    		case 1:
    			MesContacts[rowIndex].setNom((String) value);
    			break;
    		case 2:
    			MesContacts[rowIndex].setSociete((String) value);
    			break;
    		case 3:
    			MesContacts[rowIndex].setEmail((String) value);
    			break;
    		case 4:
    			lignesSelectionnees[rowIndex] = (Boolean) value;
    			break;
    		}
    	}
     
    	public void afficher_email() {
    	}
    }
    Merci

  9. #9
    Membre éprouvé
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Points : 1 034
    Points
    1 034
    Par défaut
    Chez moi ça marche normal quand j'implemente la méthode afficher_email 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
    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
    public class ModelJtable extends AbstractTableModel {
    	private Contact[] MesContacts = new Contact[] {};
        private String[] entetes = {"Prénom", "Nom", "Société", "E-mail", "Mailer"};
        public boolean[] lignesSelectionnees;
        
        public ModelJtable() {
            super();
            MesContacts = Annuaire.MesContacts;
            lignesSelectionnees = new boolean[MesContacts.length];
            afficher_email();
        }
     
        public int getRowCount() {
            return MesContacts.length;
        }
     
        public int getColumnCount() {
            return entetes.length;
        }
        
        public Class<?> getColumnClass(int columnIndex) {
        	if (columnIndex == 4)
        		return Boolean.class;
        	else
        		return String.class;
        }
     
        public String getColumnName(int columnIndex) {
            return entetes[columnIndex];
        }
        
    	public boolean isCellEditable(int rowIndex, int columnIndex) {
    		return true;
    	}
     
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch(columnIndex){
                case 0:
                    return MesContacts[rowIndex].getPrenom();
                case 1:
                    return MesContacts[rowIndex].getNom();
                case 2:
                    return MesContacts[rowIndex].getSociete();
                case 3:
                    return MesContacts[rowIndex].getEmail();
                case 4:
                	return lignesSelectionnees[rowIndex];
                default:
                    return null; //Ne devrait jamais arriver
            }
    	}	
        
        public void setValueAt(Object value, int rowIndex, int columnIndex) {
    		switch (columnIndex) {
    		case 0:
    			MesContacts[rowIndex].setPrenom((String) value);
    			break;
    		case 1:
    			MesContacts[rowIndex].setNom((String) value);
    			break;
    		case 2:
    			MesContacts[rowIndex].setSociete((String) value);
    			break;
    		case 3:
    			MesContacts[rowIndex].setEmail((String) value);
    			break;
    		case 4:
    			lignesSelectionnees[rowIndex] = (Boolean) value;
    			break;
    		}
    	}
    	
    	public void afficher_email() {
    		for (int i=0;i<lignesSelectionnees.length;i++) {
    			if (lignesSelectionnees[i]) {
    				System.out.println(MesContacts[i].getEmail());
    			}
    		}
    	}
    }
    Ensuite après avoir coché quelques lignes. Je clique sur un bouton dont le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ModelJtable m = (ModelJtable)table.getModel();
    m.afficher_email();
    Chez toi ca ne marche pas car tu appelle afficher_mail directement après avoir crée le tableau lignesSelectionnees. C'est normal que ce tableau contienne que des valeurs false au début. C'est la valeur par défaut pour les booleans.

    Bonne chance.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Oui effectivement c'est beaucoup mieux comme ca, merci pour tout cette fois c'est résolu et je vais pouvoir avancer !

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

Discussions similaires

  1. Mettre un checkbox dans une jtable
    Par ayezinehayeme dans le forum Composants
    Réponses: 1
    Dernier message: 29/04/2014, 08h18
  2. Réponses: 3
    Dernier message: 25/03/2011, 18h29
  3. mettre un checkbox dans une jtable
    Par christianf dans le forum Composants
    Réponses: 9
    Dernier message: 20/11/2010, 18h52
  4. Affichage du checkbox dans une colonne de jtable
    Par ulysse031 dans le forum Composants
    Réponses: 2
    Dernier message: 29/10/2010, 13h15
  5. [JTable] mettre deS checkbox dans une cellule
    Par Lady dans le forum Composants
    Réponses: 11
    Dernier message: 05/09/2007, 12h21

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