Bonjour.

Je ne trouve pas pourquoi certaines de mes instructions 'fireTableXyz()' ...
- ne fonctionnent pas
- fonctionnent si l'instruction est en place (= normal)
- fonctionnent même en l'absence de l'instruction. (OK, je sais que 'table.setValueAt() implique un 'fireTableDataChanged();', c à d que ' monModèleDeTable.fireTableCellUpdate)' est dès lors inutile.)

Dans ma classe de HMI principale, j'utilise l'instruction 'fireTableXyz()' à trois endroits :
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
public class FichierDonnéesDEntrée extends JScrollPane implements ActionListener
{   ...
    private JTable table;
    private MonModèleDeTable monModèleDeTable;
    ...
        monModèleDeTable = new MonModèleDeTable();
        table = new JTable(monModèleDeTable);
        JScrollPane panneauDéroulant_Table = new JScrollPane(table);
        ...
        table.getColumnModel().getColumn(0).setPreferredWidth(70);
        table.getColumnModel().getColumn(1).setPreferredWidth(10);
        ...
        /* 'fileChooser' nécessite sa classe anonyme 'ActionListener()' propre pour que
         * l'original, à demeure dans le panneau, reste adressé et pour que ne soit 
         * créé un nouveau 'fileChooser' dans une nouvelle frame pop-up lorsque son
         * bouton 'Open est actionné.    */
        fileChooser.addActionListener(new ActionListener()
            {
                @Override public void actionPerformed( ActionEvent e )
                {   
                    if (e.getActionCommand().equals(JFileChooser.APPROVE_SELECTION))
                    {
                        /* Pour éviter que les données suivantes ne viennent s'ajouter aux lignes 
                         * existantes du tableau, il faut d'abord effacer celles-ci.
                         * NE FONCTIONNE PAS !   */
                        monModèleDeTable.fireTableRowsDeleted(0, table.getRowCount()-1);
                        monModèleDeTable.populateTable(fileChooser.getSelectedFile());
                    }
                    else if (e.getActionCommand().equals(JFileChooser.CANCEL_SELECTION))
            ...
            }
            ...
@Override public void actionPerformed(ActionEvent e)
    {   
        if (e.getSource() == bout_DivisColonnes)
        {   
            ...
            if ( (Class<?>) table.getValueAt(table.getRowCount()-2, 0).getClass() == String.class )
            {   
                chaînePourTestUnique = table.getValueAt(2, 0).toString();
                // Voir s'il y a un caractère ' ' et combien consécutifs.
                if (yatilCaractEtCombien(chaînePourTestUnique, séparat, résultat) )
                {   // Des ' ' sont trouvé(s) dans la chaîne.
                    for (int rowCount=0; rowCount<=nbreLignesTotal-1; rowCount++)
                    {   
                        ...
                        séparerLesDeuxSousChaînesCaract(table.getValueAt(rowCount, 0).toString(),
                                           séparat, chaîneRemplCell1eCol, chaîneRemplCell2eCol );
                       table.setValueAt(chaîneRemplCell1eCol.getVal(), rowCount, 1);
                       table.setValueAt(chaîneRemplCell2eCol.getVal(), rowCount, 1);
                        ...
                        /* La "fireTable...()" suivante n'est pas nécessaire pour le fonctionnement désiré du fait 
                       du 'fireTableDataChanged()' un peu plus loin, mais s'avère ne pas fonctionner ! */
                        monModèleDeTable.fireTableCellUpdated(rowCount, 1);
                    }
                    table.getColumnModel().getColumn(0).setCellRenderer(new CenterTableCellRenderer());
                    table.getColumnModel().getColumn(1).setCellRenderer(new CenterTableCellRenderer());
 
                    // La "fireTable...()" suivante doit être présente pour le fonctionnement désiré et fonctionne.
                    monModèleDeTable.fireTableDataChanged();
                } else
                ...
        } else
        ...
Et ma classe 'MonModèleDeTable' :
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
public class MonModèleDeTable extends AbstractTableModel {
    ...
    MonModèleDeTable()
    {   super();        // Ne sert apparemment à rien
        donnéesDEntrée.add(new Puissance("Exemple", "", "", null));
        donnéesDEntrée.add(new Puissance("1/01/2013  00:00", "", "46.5",  null));
         ...
    public void populateTable(File pathNomFichierCsvDEntrée)
    {   
         ...
        /* Pour éviter que les données suivantes ne viennent s'ajouter aux lignes 
         * existantes du tableau, il faut d'abord effacer celles-ci.
         * NE FONCTIONNE PAS, ni avec 'this', ni avec 'super'. */
        // this.fireTableRowsDeleted(0, donnéesDEntrée.size()-1);
        super.fireTableRowsDeleted(0, 9);
        ...
       // Fonctionne comme désiré même en l'abscence de cette instruction !
        // this.fireTableDataChanged();
    }
    ...
    @Override public void setValueAt(Object valeur, int row, int col)
    {   
        Puissance puissance = donnéesDEntrée.get(row);
        switch (col)
        {   case 0:
                puissance.setDate(valeur.toString());
                break;
            case 1:
                puissance.setHeure(valeur.toString());
                break;
            case 2:
                puissance.setMesPuissHPl(valeur.toString());
                break;
            case 3:
                puissance.setMesPuissHCr(valeur.toString());
                break;
            default:
                ;
        }
        fireTableCellUpdated(row, col);     // Fonctionne bien sans cette instruction !
    }
    ...
Je dois parvenir à effacer les valeurs de toutes les cellules de ma table avant d'y mettre d'autres, soit parvenir à rendre l'instruction ' fireTableRowsDeleted(0, 9); ' opérationnelle.

Merci d'avance aux âmes activement empatiques et à Développez.com, qui m'ont déjà bien aidé ...