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

 Java Discussion :

[Java] - JComboBox figées dans JTable


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut [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 : 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 : 286
Taille : 56,9 Ko
    Merci d'avance pour votre aide.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    J'ai finalement repris pas à pas un cours sur les interfaces tableaux et ai fini par réussir...
    Merci quand même !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Il manque juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean isCellEditable(int row, int col){
    	return true;
    	}
    Dans le modèle pour rendre les JComboBox utilisables...

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

Discussions similaires

  1. Dérouler JcomboBox dans Jtable
    Par hawax dans le forum Composants
    Réponses: 0
    Dernier message: 30/03/2009, 02h02
  2. Jcombobox dans JTable
    Par goboben dans le forum Composants
    Réponses: 13
    Dernier message: 25/01/2008, 16h36
  3. Rafraichissement Jcombobox dans jtable
    Par palex dans le forum Composants
    Réponses: 1
    Dernier message: 29/08/2007, 11h52
  4. supprimer un item d'un jcombobox dans une jtable
    Par bellout dans le forum Composants
    Réponses: 6
    Dernier message: 22/06/2006, 16h06
  5. Vérification de l'etat des JComboBox dans JTable
    Par nicotine002 dans le forum Composants
    Réponses: 5
    Dernier message: 26/01/2006, 11h47

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