IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Certaines de mes instructions 'fireTableXyz()' ne fonctionnent pas


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut 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 : 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é ...
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le fire row deleted est une évènement destiné à informer tout observateur (par exemple le JTable) que les row on été supprimé.

    Mais, dans ton code, tu ne les supprime pas!!


    du coup le JTable fait son travail, il redessine les nouvelle données qu'il trouve dans ton modèle donc.... les anciennes.


    Ton code devrais être comme ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class MonModèleDeTable extends AbstractTableModel {
        public void clear()
        {   
            int size =  donnéesDEntrée.size();
            donnéesDEntrée.removeAll();
            fireTableRowsDeleted(0,size);
         }
         //...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Merci bcp, Tchize.

    Encore un dernier coup de pouce s t p (jusqu'à la prochaine discussion), concernant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    donnéesDEntrée.removeAll();
    Ce que je n'ai pas montré du code de 'monModèleDeTable' est le type de mon 'donnéesDEntrée' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private List<Puissance> donnéesDEntrée = new ArrayList<Puissance>();
        ...
        MonModèleDeTable()
        {   
            donnéesDEntrée.add(new Puissance("Exemple", "", "", ));
            donnéesDEntrée.add(new Puissance("1/01/2013  00:00", "", "46.5",  null));
            donnéesDEntrée.add(new Puissance("1/01/2013  00:15", "", "47.52", null));
            donnéesDEntrée.add(new Puissance("1/01/2013  00:30", "", "46.5",  null));
            donnéesDEntrée.add(new Puissance("1/01/2013  00:45", "", "46.42", null));
            donnéesDEntrée.add(new Puissance("1/01/2013  01:00", "", "46.42", null));
            ...
    où 'Puissance' est une classe à moi.

    Or "donnéesDEntrée.removeAll();" d'une List<E> exige un paramètre d'entrée tel que "Collection<?> c".
    Que puis-je fournir pour 'Collection<?> c' ?

    Merci bcp d'avance.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    utilise clear() à la place de removeAll, je me suis trompé de méthode.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Cher Tchize,
    Quand même encore cette dernière petite question, s t p :
    La fonction 'fireTableRowsDeleted()' (de la classe AbstractTableModel ou ascendante) génère un évènement destiné à informer tout observateur - par exemple la JTable - que lesdites rangées ont été supprimées.
    Dans mon exemple de ci-dessus, qu'est-ce qui fait au juste que 'JTable table' - qui n'est que l'un des objets de la classe principale implémentant 'ActionListeners' - devient "listener" d'un événement que génère 'AbstractTableModel" lorsque l'une de ses fonctions "fireTableXyz()" est activée ?

    Merci bcp d'avance.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    l'appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table = new JTable(monModèleDeTable);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Instruction switch ne fonctionne pas
    Par popy67 dans le forum C#
    Réponses: 6
    Dernier message: 14/08/2012, 10h10
  2. Réponses: 4
    Dernier message: 08/07/2011, 15h08
  3. Mes codes VBA ne fonctionnent pas sous access 2007
    Par ralfus dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/11/2008, 11h36
  4. mes method bean ne fonctionne pas
    Par ahmed.normal.tn dans le forum JSF
    Réponses: 5
    Dernier message: 21/04/2008, 09h19
  5. mes applications consoles ne fonctionnent pas
    Par mok16 dans le forum C++Builder
    Réponses: 1
    Dernier message: 10/01/2007, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo