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 :
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();
      }	
   }
}
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
 
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);
}
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?

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?