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 :

Problème d'affichage JTable


Sujet :

Composants Java

  1. #1
    Membre habitué
    Inscrit en
    Août 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 129
    Points : 131
    Points
    131
    Par défaut Problème d'affichage JTable
    Bonjour,
    j'essaye d'afficher une Jtable dans une interface graphique.
    j'utilise:

    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
     
       JFrame frame = new JFrame();
        ImageIcon Applicon = new ImageIcon(jar.getResource("icons/iconAppli.gif"));
        frame.setIconImage(Applicon.getImage());
     
       JDialog dialog = new JDialog(frame);
     
       dialog.setContentPane(getPrivateCleaningTable());
       dialog.pack();
     
       Toolkit tk = Toolkit.getDefaultToolkit();
       Dimension screenSize = tk.getScreenSize();
     
        dialog.setBounds(screenSize.width*5/100,screenSize.height*5/100,screenSize.width*90/100,screenSize.height*90/100);// center
     
       dialog.setTitle(this.getFullApplicationName()+" (secondary)");  
       dialog.show();
    qui renvoie à :

    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
    JTable cleanTable = new JTable(DCMParser.getPrivateCleanList(), DCMParser.getPrivateColumnNames());// get Table data Object
     
     
       javax.swing.table.DefaultTableCellRenderer dtcr = new javax.swing.table.DefaultTableCellRenderer();
       dtcr.setHorizontalAlignment(SwingConstants.CENTER);
     
       for(int x=0;x<cleanTable.getColumnModel().getColumnCount();x++)// center all excepted 1
                   if(x!=1)cleanTable.getColumnModel().getColumn(x).setCellRenderer(dtcr);
     
        cleanTable.getColumnModel().getColumn(1).setPreferredWidth(250);
     
        cleanTable.setGridColor(new Color(220,220,225));
     
        TableCellRenderer rendererFromHeader = cleanTable.getTableHeader().getDefaultRenderer();
        JLabel headerLabel = (JLabel)rendererFromHeader;
        headerLabel.setHorizontalAlignment(JLabel.CENTER);
        cleanTable.getTableHeader().setFont(new Font("Tahoma", Font.BOLD, 11));
    et à chaque tentative d'affichage, j'obtiens un message d'erreur du type:
    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
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
    	at javax.swing.JTable$1.getValueAt(Unknown Source)
    	at javax.swing.JTable.getValueAt(Unknown Source)
    	at javax.swing.JTable.prepareRenderer(Unknown Source)
    	at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
    	at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
    	at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
    	at javax.swing.plaf.ComponentUI.update(Unknown Source)
    	at javax.swing.JComponent.paintComponent(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JComponent.paintChildren(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JViewport.paint(Unknown Source)
    	at javax.swing.JComponent.paintChildren(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JComponent.paintChildren(Unknown Source)
    	at javax.swing.JSplitPane.paintChildren(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JComponent.paintChildren(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JComponent.paintChildren(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
    	at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    	at javax.swing.RepaintManager.paint(Unknown Source)
    	at javax.swing.JComponent._paintImmediately(Unknown Source)
    	at javax.swing.JComponent.paintImmediately(Unknown Source)
    	at javax.swing.RepaintManager$3.run(Unknown Source)
    	at javax.swing.RepaintManager$3.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    	at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
    	at javax.swing.RepaintManager.access$1100(Unknown Source)
    	at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$200(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    (le indexoutofbounds varie parfois).

    J'ai changé le tableau manuellement par quelque chose de très simple
    (A B C D E en titre, et 1 2 3 4 5 sur chaque ligne...) pour être sur que l'erreur ne venait pas de mon tableau, et j'ai toujours la même erreur...
    quelqu'un aurait une idée pour m'aider?
    merci d'avance!

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Points : 342
    Points
    342
    Par défaut
    Salut. Il me semble que les colonnes d'une JTable sont numérotées à partir de 1. Donc quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int x=0;x<cleanTable.getColumnModel().getColumnCount();x++)// center all excepted 1
                   if(x!=1)cleanTable.getColumnModel().getColumn(x).setCellRenderer(dtcr);
    Tu accèdes à une indice incorrect. L'exception semble mettre en cause l'indice à d'ailleurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
    	at javax.swing.JTable$1.getValueAt(Unknown Source)

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les indices de colonnes de JTable commencent en 0.

    Je pense que le problème vient plutôt du fait que le nombre de colonnes déterminées par DCMParser.getPrivateColumnNames() est différent du nombre de colonnes effectives dans DCMParser.getPrivateCleanList().

    Si tu utilises des Vector, chaque Vector contenu dans le Vector de données doit contenir le même nombre d'élément que le Vector de noms de colonnes.

    Si tu utilises des tableaux, pareil : la dimension 2 du tableau de données doit être égale à la dimension du tableau de colonnes.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre habitué
    Inscrit en
    Août 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 129
    Points : 131
    Points
    131
    Par défaut
    merci pour vos réponses.

    joel.drigo: Ce que tu dis est vrai (et évident) dans mon cas j'en ai bien tenu compte, le problème ne doit pas venir de la.

    esired: je vais regarder ça. merci.

    Edit: j'ai modifié mon tableau d'entrée pour que les 2 dimensions soient égales à la longueur du tableau des columnName, et j'ai aussi essayé de lancer la cleanTable à x=1. Aucune des solutions ne donne de résultat.

    Par contre, j'ai remarqué que lorsque je sors les Data du JTable après l'avoir créé, les noms des colonnes sont bien présent, mais les colonnes sont vides

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ca ne peut pas être ce que dit @esired : la stacktrace indique que c'est dans le code de la JTable, dans l'une de ses classes internes anonymes qu'il y a le problème.

    N'ayant pas les numéros de ligne, on ne peut que conjecturer (tu aurais intérêt à renseigner le path sur le code source de java pour les avoir : ça facilement grandement les choses).

    D'après le code source de JTable, l'exception est soulevée, à priori, lors de cet appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public Object getValueAt(int row, int column) {
            return getModel().getValueAt(convertRowIndexToModel(row),
                                         convertColumnIndexToModel(column));
        }
    Le modèle étant une classe interne anonyme, lorsqu'on créé une JTable par tableau ou Vector, l'erreur est soit sur l'indice de ligne, soit sur l'indice de colonne.


    Pour l'indice de colonne, si tu es sûr de la correspondance du nombre de colonnes entre les deux tableaux/vecteurs, le problème serait dans ce cas lors de la translation de l'indice via le ColumnModel. Modifies-tu ce modèle quelque part ?
    Pour l'indice de ligne, le problème peut venir également de la translation de l'indice de ligne, via un RowSorter par exemple. Modifies-tu le RowSorter ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre habitué
    Inscrit en
    Août 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 129
    Points : 131
    Points
    131
    Par défaut
    problème résolu:
    evidement, c'était débile, l'initialisation d'une variable utilisée dans DCMParser.getPrivateCleanList() se faisait dans DCMParser.getPrivateColumnNames() qui est appelé PLUS TARD dans la création du JTable

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par sellamelie Voir le message
    Par contre, j'ai remarqué que lorsque je sors les Data du JTable après l'avoir créé, les noms des colonnes sont bien présent, mais les colonnes sont vides
    Et pas avant de la créer ?

    Cela dit ce n'est pas le fait qu'elles soient vides qui provoquent l'exception (on aurait un NullPointerException éventuellement), mais le fait qu'on accède soit à une colonne qui n'existe pas, soit à une ligne qui n'existe pas.

    Quand tu dis "vide", tu as des lignes avec des colonnes vides, ou pas de lignes du tout ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Problème d'affichage JTable (lignes triplées)
    Par DLProject dans le forum Composants
    Réponses: 3
    Dernier message: 13/02/2012, 17h28
  2. Problème d'affichage avec le composant JTable
    Par vidocq dans le forum Composants
    Réponses: 2
    Dernier message: 03/04/2006, 11h22
  3. Problème d'affichage d'un JTable
    Par @yoyo dans le forum Composants
    Réponses: 3
    Dernier message: 22/03/2006, 09h17
  4. [JTable] problème d'affichage d'entete
    Par coco-sup dans le forum Composants
    Réponses: 3
    Dernier message: 02/12/2005, 19h47
  5. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07

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