1 pièce(s) jointe(s)
[Java] - JComboBox figées dans JTable
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:
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:
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:
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 :
Pièce jointe 456532
Merci d'avance pour votre aide.