Bonjour à tous,
J'ai un petit problème au niveau de mes évènements dans l'utilisation d'une JTable. Je vais vous décrire le fonctionnement de ma JTable en quelques mots :
Toutes les colonnes de ma table sont initialisé avec des objets de type POSTE. Un POSTE a un total horaire 1 et un total horaire 2. La dernière colonne de ma table affiche la somme horaire de toute les colonnes.
Pour que l'utilisateur puisse changer un poste dans une cellule, j'ai créé un éditeur de cellule avec une JComboBox dont voici le code :
Ensuite j'ai créé un model de table (AbstractTableModel) pour effectuer divers traitements. J'ai un petit soucis au niveau de la méthode setValue que je n'arrive pas a comprendre :
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 public class ComboPosteEditor extends DefaultCellEditor implements TableCellEditor, ActionListener { private JComboBox comboBox; private Object value; public ComboPosteEditor(JComboBox comboBox) { super(comboBox); this.comboBox = comboBox; // Permet de valider l'item sélectionné dans la comboBox uniquement sur clic de souris ou press de la touche entrée this.comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); this.comboBox.addActionListener(this); } private void initComboBox() { TblPoste poste = (value instanceof TblPoste) ? (TblPoste) value : null; int index = -1; if (poste != null) { for(int i=0; i < comboBox.getItemCount();i++) { if (poste.getIdPoste() == ((TblPoste)comboBox.getItemAt(i)).getIdPoste()) index = i; } } comboBox.setSelectedIndex(index); } @Override public Component getTableCellEditorComponent(javax.swing.JTable table, Object value, boolean isSelected, int row, int column) { this.value = value; this.initComboBox(); return comboBox; } @Override public Object getCellEditorValue() { if (comboBox.getSelectedItem() instanceof TblPoste) { TblPoste poste = (TblPoste) comboBox.getSelectedItem(); return poste; } return false; } @Override public boolean stopCellEditing() { if (comboBox.getSelectedIndex() == -1) { fireEditingCanceled(); } return super.stopCellEditing(); } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("comboBoxChanged")) { fireEditingStopped(); } } }
Mon soucis est que la valeur du poste dans le vecteur de mon modèle de table est mise à jour avant que la méthode setValue ne soit appelé? Je n'arrive pas à comprendre comment cela est-il possible?
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 public class ModelTablePoste extends AbstractTableModel{ private final Vector<Object> title; private final Vector<Vector<Object>> datas; ... @Override public void setValueAt(Object value, int row, int col) { // total horaire de la ligne entière Double total = (Double) datas.elementAt(row).elementAt(3); // old value dans la JTable if (datas.elementAt(row).elementAt(col) instanceof Poste) { // le probleme ici est que la valeur du poste dans le vecteur est // déjà initialisé avec la valeur du nouveau poste. Poste oldPoste = (Poste) datas.elementAt(row).elementAt(col); Poste newPoste = (Poste) value; // calcul de la somme horaire de la ligne total = total - oldPoste.totalHeure() + newPoste.totalHeure(); datas.elementAt(row).setElementAt(total, 3); fireTableCellUpdated(row, 3); } // mise à jour du poste dans le vecteur, étape non nécessaire car // déjà updated par je ne sais pas quel mystère datas.elementAt(row).setElementAt(value, col); fireTableCellUpdated(row, col); }
J'ai une dernière petite question au niveau de la conception, est-il préférable de faire les update en BD directement dans le modèle de la table ou de les faire dans l'évènement TableModelListener de la table?
Partager