Bonjour,
J'ai une JFrame dans laquelle j'ai un JPanel qui reçoit plusieurs JScrollPane contenant chacun un JTable. Dans chaque JTable, formé de 2 lignes, j'ai une JComboBox dans la première ligne et (plus tard) une image dans la deuxième.
J'arrive à faire afficher la JCombobox dans la première ligne, mais lorsque je clique dessus, elle ne réagit pas...
Voici mes classes :
Le JPanel avec le JTable :
Le modèle abstrait qui permet de créer le JTable :
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 public class PanneauApercuPdt extends JPanel { /** * */ private static final long serialVersionUID = 20190216; //Instancier la connexion Connection connexion = RomtazConnexion.getInstance(); //Instancier la variable qui recevra le résultat de la requête private ResultSet resultatListeEleves; //Variables pourle tableau private String nomTableListeEleves = FenetreGestionEnseignant.nomTableListeEleves; private ArrayList<Categorie> listeTotalCategories = new ArrayList<Categorie>(); private JScrollPane JSCrollIndividuel; //Liste des ateliers attachés à la catégorie private ArrayList<Atelier> listeAteliersCategorie; //Créer une liste déroulante avec la liste des ateliers de la catégorie JComboBox<String> lstAteliersCategorie = new JComboBox<String>(); public PanneauApercuPdt(String choixClasseDansListe) { //Définir la grille accueillant les JTable GridBagConstraints grillePanneauGestionTravaux = new GridBagConstraints(); this.setLayout(new GridBagLayout()); //Chercher la liste des élèves dans la BDD //Connection à la BDD try { //Sélectionner la liste de tous les élèves dans la BDD resultatListeEleves = this.connexion.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, //Requête qui sélectionne tous les ateliers de la table des ateliers ResultSet.CONCUR_READ_ONLY).executeQuery("SELECT * FROM " + nomTableListeEleves + " WHERE classeeleve = '"+ choixClasseDansListe + "' ORDER BY prenomeleve"); //Le nombre de colonnes du tableau correspond au nombre de catégories //Prélever le nombre de catégories DAO<Categorie> listeCategories = DAOFactory.getCategorieDAO(); listeTotalCategories = listeCategories.trouverListeObjetsUnCritere(choixClasseDansListe); //Variable permettant de placer les composants à la ligne suivante dans la grille int ligneComposants = 0; //Récupérer l'identité des élèves while(resultatListeEleves.next()) { //Étiquette qui recevra l'identité de l'élève JLabel lblIdentiteEleve = new JLabel(); //Modèle abstrait qui sera mis dans le JTable ModeleTableauApercuPdt modeleTableauApercu = new ModeleTableauApercuPdt(listeTotalCategories); //JTable qui recevra le plan de travail JTable tableauApercuPlanTravail = new JTable(modeleTableauApercu); //Créer l'instance du rendu/éditeur AtelierCellEditor comboCellEditor = new AtelierCellEditor(listeTotalCategories); //Parcourir toutes colonnes du JTable créé for (int numColonne = 0 ; numColonne < listeTotalCategories.size(); numColonne++) { //Leur affcter le rendu tableauApercuPlanTravail.getColumnModel().getColumn(numColonne).setCellRenderer(comboCellEditor); //Leur affecter l'éditeur tableauApercuPlanTravail.getColumnModel().getColumn(numColonne).setCellEditor(comboCellEditor); } //Hauteur de ligne suffisante pour voir toute la JComboBox tableauApercuPlanTravail.setRowHeight(tableauApercuPlanTravail.getRowHeight()+3); //Positionnement dans la première case de la grille grillePanneauGestionTravaux.gridx = 0; //Grille avec le double de lignes que d'élèves grillePanneauGestionTravaux.gridy = ligneComposants; //Dans la première ligne : identité de l'élève lblIdentiteEleve = new JLabel(resultatListeEleves.getString("prenomeleve") + " " + resultatListeEleves.getString("nomeleve")); this.add(lblIdentiteEleve, grillePanneauGestionTravaux); //Dans la deuxième ligne : JTable avec les images grillePanneauGestionTravaux.gridy = ligneComposants + 1; //Placer le JTable dans un JScrollPane JSCrollIndividuel = new JScrollPane(tableauApercuPlanTravail); JSCrollIndividuel.setPreferredSize(new Dimension(900,100)); //Inséré lui-même dans la grille du JPanel this.add(JSCrollIndividuel, grillePanneauGestionTravaux); //Augmenter le numéro de ligne ligneComposants = ligneComposants + 2; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Le CellRenderer/Editor (tiré de ce fil de discussion) :
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 public class ModeleTableauApercuPdt extends AbstractTableModel { /** * */ private static final long serialVersionUID = 20190703; //Liste des catégories pour les titres private ArrayList<Categorie> listeCategories = new ArrayList<Categorie>(); //Tableau pour les titres des colonnes private String[] colonnes; //Liste des ateliers attachés à la catégorie private ArrayList<Atelier> listeAteliersCategorie; // = new ArrayList<Atelier>(); public ModeleTableauApercuPdt(ArrayList<Categorie> listeCategoriesRecue) { //Définir la liste des catégories this.listeCategories = listeCategoriesRecue; //Définir la taille du tableau pour les titres de colonnes colonnes = new String[listeCategories.size()]; //Définir l'index pour parcourir le tableau des titres int numColonne = 0; //Compléter le tableau des titres de colonnes avec les noms des catégories for (Categorie categorie : listeCategories) { //Parcourir les colonnes su tableau des titres et leur affecter le nom de la catégorie colonnes[numColonne] = categorie.getNomCategorie(); //Pour chaque catégorie, relever sa liste d'atelier DAO<Atelier> listeAteliers = DAOFactory.getAtelierDAO(); listeAteliersCategorie = new ArrayList<Atelier>(); listeAteliersCategorie = listeAteliers.trouverListeObjetsUnCritere(categorie.getNomCategorie()); //Passer à la colonne suivante numColonne++; } } @Override public int getColumnCount() { //Autant de colonnes que de catégories return colonnes.length; } @Override public int getRowCount() { //Deux lignes dans le tableau : // * Liste déroulante des ateliers de la catégorie // * Image de l'atelier sélectionné pour le plan de travail return 2; } @Override public String getColumnName(int columnIndex) { return colonnes[columnIndex]; } @Override //Ici on spécifie la valeur de chaque cellule public Object getValueAt(int row, int col) { Atelier atelier = listeAteliersCategorie.get(row); if (row == 0) { //Mettre la valeur qui apparaîtra en entête de la JComboBox return atelier.getNomAtelier(); } else if (row == 1){ //Mettre l'image de l'atelier return null;//atelier.getImageAtelier(); } return null; } }
Voici un petit aperçu de ce que j'obtiens :
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 public class AtelierCellEditor extends DefaultCellEditor implements TableCellRenderer { /** * */ private static final long serialVersionUID = 20190308; //Définir la JComboBox qui recevra des String private JComboBox<String> comboListeAteliers; public static ArrayList<Categorie> listeCategories = new ArrayList<Categorie>(); public static ArrayList<Atelier> listeAteliersCategorie = new ArrayList<Atelier>(); /** * Cette classe combine la notion d'éditeur sous forme de combo * et de renderer sous forme de combo * On utilise un DefaultCellEditor qui a déjà toute la mécanique * pour gérer un TableCellEditor de type combo */ public AtelierCellEditor(ArrayList<Categorie> listeCategoriesRecue) { //Attribuer la JComboBox à cette classe super(new JComboBox<>()); //Récupérer la JComboBox remplie comboListeAteliers = (JComboBox<String>)getComponent(); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { //Toutes les cellules de la première ligne sont éditables sous forme de JComboBox if (row == 0) { //Remplir la combo avec un nouveau modèle contenant le résultat de ma requête comboListeAteliers.setModel(new DefaultComboBoxModel<>(loadValues((Integer)table.getModel().getValueAt(row, column)))); if (isSelected) { //Afficher la combo sélectionnée en changeant de couleur quand la cellule est sélectionnée comboListeAteliers.setBackground(table.getSelectionBackground()); } else { //Afficher dans la couleur normale comboListeAteliers.setBackground(table.getBackground()); } //Rappeler la méthode normale qui va se charger du reste du rendu de l'éditeur return super.getTableCellEditorComponent(table, value, isSelected, row, column); } else { return null; } } // méthode de TableCellRenderer destinée à créer le composant qui affiche la valeur dans la colonne @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { //Afficher le composant dans toute la première ligne if (row == 0) { //Créer une nouvelle combo avec juste une valeur pour faire un rendu qui ressemble à un éditeur JComboBox<String> renderCombo = new JComboBox<>(new DefaultComboBoxModel<>(new String[]{(String)value})); return renderCombo; } else { //Sinon renvoyer une imagea return new JLabel("Image Atelier"); } } public static String[] loadValues(int value) { /** * Normalement je dois mettre ma requête ici pour compléter ma JComboBox * J'ai essayé avec la liste basique de l'exemple avant de me lancer dans plus compliqué * Mais même comme ça, mes JComboBox sont figées... */ switch(value) { case 0: return new String[]{"machin", "machin1", "machin2"}; case 2: return new String[]{"truc","truc1","truc2"}; case 3: return new String[]{"bidule","bidule1","bidule2"}; } return null; } }
Merci d'avance pour votre aide.
Partager