Bonjour à toutes et a tous,
je suis débutant en java et j'essaie de comprendre tant bien que mal comment fonctionnent des JTable avec des composants de types ComboBox notamment.
Je suis plus ou moins parvenu à mes fin en bidouillant mais j'aimerai avoir votre avis .
Donc j'ai un tableau avec une colonne qui contient des JCombobox, les comboBox sont gérés naturellement, en initialisant l' éditeur des cellule d'une colonne avec un objet DefaultCellEditor qui reçoit en paramètre une JComboBox
this.tableau.getColumn("TEST").setCellEditor(new DefaultCellEditor(new JComboBox(comboData)));
mais je ne voyais pas trop comment gérer les lignes et colones dans la classe me servant de listener de cette manière , de plus j'avais quelques problème d'affichage ...
J'ai donc créé un objet comboEditor hérité de defaultCellEditor, mais j'ai eu un petit problème car étant donné que je n' avais qu'un seul ComboBox pour toute la colonne, lorsque je choisissais un des éléments de la liste d'un comboBox et que je cliquais sur le comboBox d'une autre ligne (qui si j'ai bien compris et le même ) l'affichage se mettant à jour et j'obtenais la même sélection partout ou je cliquais ...
Pour résoudre ce problème j'ai créé un tableau de JComboBox dans ma classe
ComboEditor, avec autant de combo que j'ai de ligne et je me base donc sur la ligne pour savoir à quel combo j'ai affaire . De cette manière je n'ai plus de problème . Je me sert de l'item sélectionné pour la méthode getCellEditorValue .
1 2 3 4
|
public Object getCellEditorValue(){
return comboBox[this.ligne].getSelectedItem();
} |
Ça ma permis de régler un autre problème, car je souhaitais aussi afficher le comboBox des le début et non pas uniquement au click.
J' avais créé une classe ComboRenderer hérité d'un JComboBox implémentant TableCellRenderer , et je me servais de la valeur récupéré pour changer le setSelected du rendu ( JcomboBox unique pour tout le rendu il me semble ).
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
|
import java.awt.Component;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
public class ComboRenderer extends JComboBox implements TableCellRenderer{
public ComboRenderer()
{
this.addItem("Très bien");
this.addItem("Bien");
this.addItem("Mal");
}
public Component getTableCellRendererComponent( JTable table, Object value,
boolean isSelected, boolean isFocus,
int row, int col) {
System.out.println("ComboRenderer "+row+" "+col);
this.setSelectedItem(value);
return this;
}
} |
Je vous met aussi le code du comboEditor
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
|
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
public class ComboEditor extends DefaultCellEditor {
protected JComboBox[] comboBox;
private boolean isPushed;
private comboListener bListener = new comboListener();
private int ligne ;
public ComboEditor(JCheckBox checkBox, int nCombo)
{
super(checkBox);
//On crée à nouveau notre bouton
comboBox = new JComboBox[nCombo];
for( int i = 0 ; i < nCombo ; i ++ )
{
comboBox[i] = new JComboBox();
comboBox[i].setOpaque(true);
comboBox[i].addItem("Très bien");
comboBox[i].addItem("Bien");
comboBox[i].addItem("Mal");
//On lui attribue un listener
comboBox[i].addActionListener(bListener);
}
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
//On définit le numéro de ligne à notre listener
bListener.setRow(row);
//Idem pour le numéro de colonne
bListener.setColumn(column);
//On passe aussi le tableau pour des actions potentielles
bListener.setTable(table);
this.ligne = row ;
//On renvoie le combo
return comboBox[row];
}
public Object getCellEditorValue(){
return comboBox[this.ligne].getSelectedItem();
}
class comboListener implements ActionListener{
private int column, row;
private JTable table;
private int nbre = 0;
private JComboBox combo;
public void setColumn(int col){this.column = col;}
public void setRow(int row){this.row = row;}
public void setTable(JTable table){this.table = table;}
public JComboBox getCombo(){return this.combo;}
public void actionPerformed(ActionEvent event) {
System.out.println("editor listener : "+comboBox[row].getSelectedItem());
}
}
} |
Voila en faisant ainsi j'obtiens un résultat qui me semble satisfaisant mais étant débutant je préfère avoir l'avis de plus expérimentés .
On a souvent tendance a se compliquer la vie inutilement au début
.
Merci d'avance pour le temps que vous m 'aurai accordé !
Partager