1 pièce(s) jointe(s)
Sélection dans JComboBox pour changer image dans une autre cellule
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:
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:
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:
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...
Pièce jointe 462986
Merci d'avance !!
Bonne journée !