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 :

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 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
 
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;
 
}
}
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
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;
	}
}
Voici un petit aperçu de ce que j'obtiens :

Nom : JComboBoxFigees.png
Affichages : 356
Taille : 56,9 Ko
Merci d'avance pour votre aide.