Certaines de mes instructions 'fireTableXyz()' ne fonctionnent pas
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:
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:
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é ...