Bonjour,

J'ai plusieurs JTable dans un JPanel. Chaque tableau contient 2 lignes : une avec des JComboBox et une avec des Images.
J'aimerais que le choix de la JComboBOx détermine l'image qui s'affichera juste en-dessous...
Je crée mon JTable à partir d'un modèle, j'utilise un Renderer et un Editor, mais je ne vois pas où intervenir pour que cette action soit effective...

Voici mon modèle :
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
 
import java.util.ArrayList;
import javax.swing.JComboBox;
import javax.swing.table.AbstractTableModel;
import fr.romtaz.objets.Categorie;
import fr.romtaz.vue.PanneauApercuPdt;
public class ModeleTableauApercuPdt extends AbstractTableModel {
 
 //Liste des catégories pour les titres
	private ArrayList<Categorie> listeCategories = new ArrayList<Categorie>();
	//private JComboBox<String> comboAteliers = new JComboBox<String>();
	//Tableau pour les titres des colonnes
	private String[] colonnes;
 
	public ModeleTableauApercuPdt(ArrayList<Categorie> listeCategoriesRecue) {//, JComboBox<String> comboListeAteliersRecue) {//, String adresseImageRecue) { // ,ArrayList<Atelier> listeTousAteliersRecue) {, String adresseImageRecue) {
		//Définir la liste des catégories
		this.listeCategories = listeCategoriesRecue;
		//this.comboAteliers = comboListeAteliersRecue;
 
		//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;
 
		//Définir le titre des colonnes en fonction du nombre de catégories : Atelier N°...
		for (int numAtelier = 1 ; numAtelier <= listeCategories.size(); numAtelier++) {
 
			//En titre de colonne numéroter les ateliers pour permettre plus de flexibilité dans les choix
			colonnes[numColonne] = "Atelier " + numAtelier;
 
			//Passer à la colonne suivante
			numColonne++;
		}
	}
 
@Override
//Nombre de colonnes du tableau
public int getColumnCount() {
	//Autant de colonnes que de catégories
	return colonnes.length;
}
 
@Override
public String getColumnName(int columnIndex) {
	//Titres des colonnes
	return colonnes[columnIndex];
}
 
@Override
//Nombre de lignes
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
//Ici on spécifie la valeur de chaque cellule
public Object getValueAt(int row, int col) {
 
	return null;
}
 
public void setValueAt(Object value, int row, int column) {
 
}
 
//Retourne vrai si la cellule est éditable : celle-ci sera donc éditable
public boolean isCellEditable(int row, int col){
	//Seule la première ligne du tableau sera éditable
	if (row==0) {
	    return true;
	}
	else {
		return false;
	}
}
}
Voici mon Renderer :
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
 
import java.awt.Component;
import java.awt.Image;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
 
public class ComboCellRenderer extends DefaultCellEditor implements TableCellRenderer {
 
//Variables pour l'affichage d'une image
	private ImageIcon imgAffichage;
	private String adresseImageAffichage;
	private String nomAtelierPourImage;
	private JLabel lblImageAtelier = new JLabel();
 
	//Constructeur
	public ComboCellRenderer() {
		super(new JComboBox<>());
		}
 
	public ComboCellRenderer(String adresseImageAffichageRecue, String nomAtelierPourImageRecu) {
		super(new JComboBox<>());
 
		this.adresseImageAffichage = adresseImageAffichageRecue;
		this.nomAtelierPourImage = nomAtelierPourImageRecu;
	}
 
	//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) {
 
		//Définir la JComboBox qui servira d'entête
		JComboBox<String> renderCombo = null;
 
		//Afficher la JComboBox uniquement dans la première ligne
		if (row == 0) { 
			try {
				//Utile pour afficher l'atelier sélectionné en fonction des travaux des élèves
				renderCombo = new JComboBox<>(new String []{this.nomAtelierPourImage});
 
				} catch (NullPointerException pasSelection) {
 
			}
 
		//Renvoyer la JComboBox qui servira d'entête
		return renderCombo;
	}
 
		else  {
 
			//Définir l'image et sa taille d'après l'adresse reçue
			imgAffichage = new ImageIcon(new ImageIcon(adresseImageAffichage).getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT));
 
			//Centrer l'image dans l'étiquuette
			lblImageAtelier.setHorizontalAlignment(lblImageAtelier.CENTER);
			//Renvoyer une étiquette avec l'image sélectionnée
			lblImageAtelier.setIcon(imgAffichage);
 
			return lblImageAtelier;
 
		}
	}
}
Voici mon Editor :
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
 
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.AbstractCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import fr.romtaz.objets.Atelier;
 
public class ComboCellEditor extends AbstractCellEditor
implements TableCellEditor, ActionListener {
 
private String nomAtelier;
	private ArrayList<Atelier> listeAteliers;
 
//Déclarer la JComboBox ici sinon elles prennent toutes la dernière valeur choisie
	JComboBox<String> comboAteliers;
 
 
	public ComboCellEditor(ArrayList<Atelier> listeAteliersRecue) {
		this.listeAteliers = listeAteliersRecue;
	}
 
	@Override
	public Object getCellEditorValue() {
		return nomAtelier;
	}
 
	@Override
	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column) {
 
		if (row == 0) {
			//Déclarer la JComboBox ici sinon elles prennent toutes la dernière valeur choisie
			comboAteliers = new JComboBox<String>();
 
			//Remplir la combo avec la liste des ateliers
			for (Atelier aAtelier : listeAteliers) {
				comboAteliers.addItem(aAtelier.getNomAtelier());
			}
 
			//Permet de récupérer le nom de l'atelier sur lequel on a cliqué, mais pour quoi faire?
			comboAteliers.addActionListener(this);
 
			return comboAteliers;
		}
 
		else {
			return null;
		}
	}
 
	@Override
	public void actionPerformed(ActionEvent event) {
		JComboBox<String> comboAteliers = (JComboBox<String>) event.getSource();
		nomAtelier = (String) comboAteliers.getSelectedItem();
		System.err.println("\n[ComboCellEditor] - Vous avez choisi : " + nomAtelier);
 
	}
 
	//Permet de recommencer une édition dans les différentes cellules si retourne true
	public boolean stopCellEditing() {
		return true;
	}
}
Une capture pour mieux comprendre...
Nom : changerImageAvecComboBox.png
Affichages : 202
Taille : 108,5 Ko

Merci d'avance !!
Bonne journée !