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

Composants Java Discussion :

JTable, XML et modèles


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Par défaut JTable, XML et modèles
    Bonjour,

    je viens vers vous après plusieurs jours de recherche pour un problème qui est vraisemblablement traité souvent dans cette section.

    J'ai un fichier XML qui est créé par mon application et qui doit être affiché dans une JTable. Dans l'ancienne version de ma JTable, je la créais sans passer par un modele et cela me convenait jusqu'à ce que je me rende compte que la JTable ne pouvait pas se rafraichir sans tableModel.
    Depuis ce moment, j'ai un gros problème, je n'ai plus rien dans ma JTable

    Je viens vers vous car je tourne en rond...

    Voici le code de mes classes JTable et Model
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    public class remindEnCours {
     
     
     
        private  JScrollPane scrollPane;
        static JTable tableXML;
     
     
     
        public remindEnCours(FenetrePrincipale fenetre)
        {
            modeleTable monModele=new modeleTable();
            tableXML=new JTable(monModele);
            tableXML.setVisible(true) ;     
            centrerTable(tableXML);
            fenetre.getContentPane().add(new JScrollPane(tableXML), BorderLayout.CENTER);
        }
     
     
     
        private void centrerTable(JTable table) 
        {     
            DefaultTableCellRenderer custom = new DefaultTableCellRenderer();
            custom.setHorizontalAlignment(JLabel.CENTER);
            for (int i=0 ; i<table.getColumnCount() ; i++)
            table.getColumnModel().getColumn(i).setCellRenderer(custom);
            TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer();
            ((DefaultTableCellRenderer) headerRenderer).setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
         }
     
        public class modeleTable extends DefaultTableModel {
     
     
            private Document document;
            private  Element racine;
            private  String[] columnNames={"Id", "Libellé de l'alerte", "Date", "Répétition", "Active"}; 
            private  Object[][] data;
     
            public modeleTable()
            {
            SAXBuilder sxb = new SAXBuilder();
            try {
                document = sxb.build(new File(".//files/Alertes.xml"));
            } catch (Exception e5) {
                e5.printStackTrace();
            }
     
            racine = document.getRootElement();
            System.out.println("racine " + racine);
            List listJob = racine.getChildren("alerte");
            FenetrePrincipale.barreEtat.setText(listJob.size()+" éléments chargés");
            Iterator i = listJob.iterator();
            while (i.hasNext())
            {
                Element courant = (Element) i.next();
                String[] rowData = {
                        courant.getAttributeValue("id"),
                        courant.getChild("libelle").getText(),
                        courant.getChild("date").getText(),
                        courant.getChild("frequence").getText(),
                        courant.getChild("active").getText()
                };
     
                fireTableDataChanged();
                addRow(rowData);
            }
            } 
     
        }
     
    }
    Merci d'avance!

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    1. columnNames et data ne sont pas utilisés
    2. Tu "fire" avant de modifier tes données
    3. addRow notifie déjà les changements aux tables
    4. Inutile de notifier avant d'avoir construit le modèle.
    5. Es-tu sûr que ton modèle est remplis ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Par défaut
    Pour columNames et data, je les avais utilisé dans mes différents tests et en effet je ne les utilise pas maintenant.
    Je ne comprends quand tu dis que je fire avant de modifier les données: fire n'indique pas simplement à la table que quand le xml change, il doit recharger la table?
    Tu dis que je notifie avant de construire mon modèle... je suis un peu perdu

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Tu appeles la méthode "fireTableDataChanged" dans ton constructeur et avant d'appeler la méthode "addRow".

    La méthode "addRow" appelle la méthode "fireTableRowsInserted"
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Par défaut
    le fire ne sert à rien donc. Ou faut il placer le addRow afin que les changements du fichier XML soient pris en compte? J'ai essayé de suivre le tuto sur le site mais j'arrive pas à l'adapter à mon cas...

  6. #6
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Par défaut
    j'ai modifié mon code, les données apparaissent au lancement mais quand je rafraichis la table avec mon action, rien ne se passe:
    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
    65
    66
    67
    68
    69
     
    public class remindEnCours {
     
     
     
        private JScrollPane scrollPane;
        static JTable table;
        private Vector columnNames;
        private Vector data;
        private Document document;
        private Element racine;
     
    	public remindEnCours(FenetrePrincipale fenetre)
    	{
    		columnNames = new Vector();
            columnNames.add("Id");
            columnNames.add("Libelle");
            columnNames.add("Date");
            columnNames.add("Répétition");
            columnNames.add("Active");
            data = new Vector();
            table = new JTable(data, columnNames);
            SAXBuilder sxb = new SAXBuilder();
    	    try {
    	        document = sxb.build(new File(".//files/Alertes.xml"));
    	    } catch (Exception e5) {
    	        e5.printStackTrace();
    	    }
    	    racine = document.getRootElement();
    	    List listJob = racine.getChildren("alerte");
    	    Iterator i = listJob.iterator();
    	    FenetrePrincipale.barreEtat.setText(listJob.size()+" éléments chargés");
    	    while (i.hasNext())
    	    {
    	    	Element courant = (Element) i.next();
    	    	String[] rowData = {
    	    			courant.getAttributeValue("id"),
    	    			courant.getChild("libelle").getText(),
    	                courant.getChild("date").getText(),
    	                courant.getChild("frequence").getText(),
    	                courant.getChild("active").getText()
    	    	};
    	    	((DefaultTableModel) table.getModel()).addRow(rowData);
     
    	    }
     
            centrerTable(table);
            fenetre.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
     
    	}
     
     
     
    	public static void centrerTable(JTable table) 
        {     
        	DefaultTableCellRenderer custom = new DefaultTableCellRenderer();
        	custom.setHorizontalAlignment(JLabel.CENTER);
        	for (int i=0 ; i<table.getColumnCount() ; i++)
        	table.getColumnModel().getColumn(i).setCellRenderer(custom);
        	TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer();
        	((DefaultTableCellRenderer) headerRenderer).setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
         }
     
     
     
     
     
     
    }
    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
     
    private class SwingAction1 extends AbstractAction {
    		public SwingAction1() {
    			putValue(NAME, "Valider");
    			putValue(SHORT_DESCRIPTION, "Valider");
    		}
    		public void actionPerformed(ActionEvent e) {
     
     
     
    			try {
    				alerte nouvelleAlerte=new alerte();
    				ecrireID(fichierId);
    			} catch (ParseException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
     
    			DefaultTableModel model=(DefaultTableModel)remindEnCours.table.getModel();
    			model.fireTableDataChanged();
    			remindEnCours.table.setModel(model);
    			RemindMe.fenetre.getContentPane().add(new JScrollPane(remindEnCours.table), BorderLayout.CENTER);
    			setVisible(false);
     
     
    		}
    	}
    merci de votre aide!

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

Discussions similaires

  1. JTable et son modèle en utilisant Netbeans
    Par maparè dans le forum Composants
    Réponses: 4
    Dernier message: 11/03/2010, 15h28
  2. JTable, XML et CLASSPATH
    Par Maxiflo dans le forum Composants
    Réponses: 2
    Dernier message: 18/12/2008, 09h17
  3. Réponses: 1
    Dernier message: 13/09/2008, 07h01
  4. Réponses: 2
    Dernier message: 03/05/2007, 09h38
  5. [JTable] Incompréhension du modèle
    Par etiennegaloup dans le forum Composants
    Réponses: 6
    Dernier message: 15/09/2005, 20h00

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