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

Agents de placement/Fenêtres Java Discussion :

Utilisation de fireTableDataChanged()


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Par défaut Utilisation de fireTableDataChanged()
    Bonjour,

    J'ai un tabbedPane initialisé par un JTree (les branches cliquées importent des tabs dans le tabbedPane). Dans chaque Tab j'ai des JPanel contenant des JTables.

    Les données du JTree arrivent d'un autre programme ( transfert XML...) et j'aimerais effectuer un refresh (lors d'un appui sur un bouton) de ces tabs même lorsqu'elles sont ouvertes. Le refresh marche mais si la Tab est ouverte et qu'elle a été modifiée, l'affichage lui ne l'est pas. je dois alors fermer la tab et la reouvrir.

    J'utilise pourtant la méthode fireTableDataChanged() mais je dois mal l’implémenter, voilà ce que je fais en gros (une partie du code est retire pour plus de clarté) :

    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
    public class aveStatusTablePanel extends JPanel {
     
        private JTable table;
        private DefaultTableModel tableModel;
        private JButton deleteButton;
        private int minNbrOfRows = 0;
        private int initialNbrOfRows = 2;
        private JLabel elementLabel = null;
        private aveComboBoxCellRenderer comboRenderer[];
        private static final Matcher TWO_DIM_TABLE = Pattern.compile("(?s)^\\(\\s*\\[.*\\]\\s*\\)").matcher("");
     
     
        public aveStatusTablePanel(String[] header) {
     
        private void initStatusTablePanel(String[] header) {
     
            Object[][] data = {};
            int dimension = header.length;
     
            // Create empty table (rows are added dynamically)
            tableModel = new DefaultTableModel(data, header);
            table = new JTable(tableModel);
            table.setDefaultRenderer(Object.class, new aveTableCellRenderer());
            // Usually editing is not terminated if the focus is lost, change this!
            table.putClientProperty("terminateEditOnFocusLost", true);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
     
            // Pack table
            aveTableCustom.packColumns(table, 25);
            aveTableCustom.packRows(table, 0);
            // Embed table into scroll pane
            aveTableScrollPane tableScroll = new aveTableScrollPane(table);
     
            // Layout is BorderLayout
            this.setLayout(new BorderLayout());
     
            // Give any resize space to table
            this.add(tableScroll, BorderLayout.CENTER);
        }
     
        public void refresh() {
     
            tableModel.fireTableDataChanged();
            table.setModel(tableModel);
            JScrollPane scrollPane = new JScrollPane(table);
            this.add(scrollPane, CENTER_ALIGNMENT);
        }
    }
    Ca c'est pour la classe qui crée les JPanels de mes Tabs.
    Le refresh général se fait dans une autre fonction, voila le code :
    Secret (cliquez pour afficher)
    Code : Java - Sélectionner
    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
    public boolean refreshResultStatus() {
            // Success of refreshing
            boolean success = true;
            DOMTree domTree = getDOMTree();
            Stack<Integer> toBeDeleted = new Stack<Integer>();
            for (int i = 0; i < tabbedPane.getTabCount(); i++) {
                String funcDef = getFunction((JPanel) tabbedPane.getComponentAt(i)).replaceFirst(";$", "");
                Map<String, String> paramMap = aveScanFormat.scanFunction(funcDef);
                String funcType = paramMap.get("funcType");
     
                TreeNode funcDefNode = getFuncNode(domTree, funcType);
                if (funcDefNode == null || resultsNodeIsDisabled(domTree, funcDefNode, funcType)) {
                    toBeDeleted.push(i);
                    success = false;
                }
                // Function is valid, update StatusPanel
                aveStatusTablePanel StatusPanel = (aveStatusTablePanel) getPanelParameter(i, "status");
                StatusPanel.refresh();
            }
            // Delete invalid contents, if there are any
            while (!toBeDeleted.empty()) {
                tabbedPane.remove(toBeDeleted.pop());
            }
            // update corresponding status panel AFTER all functions have been processed
            updateStatus();
            return success;
        }
    Je pense ne pas être loin de la solution mais je bloque un peu.

    Quelqu'un saurait-il m'expliquer comment procéder ?

    Je vous en remercie d'avance.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le fireTableDataChanged notifie à la JTable que les données contenues dans le TableModel ont changé.

    Or à aucun moment tu ne modifies le contenu du modèle...
    Comme la JTable s'appuie sur les données dans le modèle, les données contenues dans la JTable ne bougeront pas d'un iota à l'appel de ta méthode refresh.
    CQFD.

    De plus ton setModel qui suit l'appel à fireTableDataChangedne sert strictement à rien (et va plutôt réinitialiser tout le statut graphique de ta JTable - genre position du scroll, taille des colonnes & cie - vu que le modèle change).

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Par défaut
    Ok je comprends, mais je ne comprends pas alors l'utilite du fireTableDataChanged()..
    Il faudrait que dans mon refresh je reitere un initStatusTablePanel, mais cela veut dire que ma table sera carrement changee et ma Tab du tabbedPane aussi donc en aucun cas que ca actualise la Tab en cours.. dis moi si je me trompe? Je t'avoue tourner en rond depuis plusieur jours.

    Je viens de voir les methode revalidate() et paint() pour la table, je dois m'orienter par la??
    Merci d'avance!

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le fireTableDataChanged sert à notifier à la JTable que les données dans le modèle ont été changées.

    Bref pour modifier des données dans ton JTable de façon programmatique voici la marche à suivre.


    1. Récupérer le modèle (via un getModel(), a moins que l'on aie déjà une référence sous la main)
    2. Modifier le contenu du modèle à grand coups de setValueAt (Voir coder son propre modèle héritant d'AbstractTableModel si l'on a besoin de plus de fonctionnalités, genre ajout et suppression de lignes à la volée)
    3. notifier à la JTable que le modèle a été modifié via un fireTableXXX (en général le plus atomique possible, si l'on change une ligne, inutile d'utiliser un fireTableDataChanged, un fireTableRowUpdated suffira amplement)

    Bref, tu t'es jeté la tête la première dans la JTable sans trop comprendre les relations modèle/composant.

    Donc je te conseille très fort d'aller suivre de façon attentive le tutoriel concernant ce composant que nous mettons gracieusement à disposition. Ca te permettra de te rafraîchir un tant soit peu les idées

    http://baptiste-wicht.developpez.com.../swing/jtable/

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Par défaut
    Merci beaucoup, j'ai suivie la marche a suivre que tu m'as donne et j'effectue ceci maintenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public void refresh() {
    tableModel.setValueAt("Test", 1, 1);
            tableModel.fireTableDataChanged();
        }
    Mon probleme est pour acceder aux donnees des cellules car je remplis ma table seulement apres avoir creer mon aveStatusTablePanel, dans un autre programme. ( Je fais ensuite un appel a une methode setContent)... donc je ne sais pas trop comment les recuperer.

    Mais je me demande, c'est seulement une reecriture de cellules au final, et non une " reouverture de la tab"?

Discussions similaires

  1. Comment utiliser fireTableDataChanged ?
    Par Ticoche dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 01/06/2007, 17h28
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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