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 :

Rafraîchissement du panel dans la JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut Rafraîchissement du panel dans la JTable


    Voila avant de vous définir le problème, voici le code (cf. pièce jointe)
    Il n'est pas très long je vous rassures. De plus, la classe TestJTable, est là juste pour tester les autres classes

    Donc j'explique mon pbm (Toutefois le mieux est d'exécuter le code et de faire deux suppression de ligne, vous verrez tout de suite le bug).
    J'ai une JTable (5 lignes 1 colonne). Chaque cellule est u Panel.
    J'utilise les interfaces TableCellRenderer et TableCellEditor pour afficher et éditer mon panel dans ma JTable. Jusque la, tout va bien. La ou ça coince, c'est quand je fais une suppression d'une ligne. Les données sont correctement supprimées du tableau, mais les panels ne suivent pas. Mais la ou c'est encore plus bizarre, c'est qu'a la première suppression, tout fonctionne, mais à la deuxième ça part en vrille.
    Quelqu'un aurait il une idée de ou cela pourrais venir ? (J'ai cherché sur le net, mais sans succès).

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Mais la ou c'est encore plus bizarre, c'est qu'a la première suppression, tout fonctionne, mais à la deuxième ça part en vrille.
    Pourrais-tu précisé ce qu'il se passe exactement ?
    Et donne le code de la méthode de TableCellRenderer. Merci.

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut
    Citation Envoyé par Janitrix
    Et donne le code de la méthode de TableCellRenderer. Merci.
    Biensur, mais j'ai mis le code (ultra simplifié et tres cours dans le fichier join) mais voici une copie de ce que tu me demande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MyTableCellRenderer implements TableCellRenderer {
     
    	public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
     
    		Component cpn = new MyJPanelUnselected((MyData)arg1);
    		return cpn;
    	}
    }
    Pour préciser mon problème un peu plus, voila
    J'ajouter des données dans la JTable de type MyData.
    Si je n'utlise pas les deux classes abstraites TableCellRenderer et TableCellEditor, tout ce passe bien. je supprime mes ligne, de mon tableau et l'affichage est correcte.
    Bon mais c'est pas tout, la classe MyData qui est une classe perso, ne peu pas être affichée telle quel dans la JTable, sion ca affiche un peu n'importe quoi. Donc j'ai associé à mes cellules (1 colonne) de ma JTable en rendu par Panel et aussi un editeur (pour modifier les valeurs évidement). La encore sa fonctionne impec. Le problème ce pose lorsque je supprime une ligne (donc une cellule). La dataModel supprime effectivement la ligne, mais à l'affichage les panel ne sont pas rafraichis correctement. J'ai bien esseayer invalidate, repaint, etc..., mais que dal, il n'y a pas de différence.
    Mais franchement, c'est assez complexe à expliquer, le mieux c'est de vraiement exécuter le code et de voir, ca sera plus clair.

    Merci d'avance

  4. #4
    Membre éclairé Avatar de biozaxx
    Profil pro
    Inscrit en
    Août 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 403
    Par défaut
    salut,

    ton probleme est tres simple et peut etre reproductible dès la premiere supression:

    si tu lances ton code , que tu ne selectionnes aucune cellule et que tu clic sur le bouton 'del' aucune ligne n'est suprimée.

    si tu lance le code, tu selectionnes une ligne, tu clic sur del , cela efface effectivement la ligne selectionnée, si tu reclic a nouveau sur 'Del' rien ne se passe

    si en revanche apres la supression tu reselectionnes une ligne et que tu clic sur 'del' et bien la ta ligne est belle et bien suprimée.

    tout ca pour dire que ceci est du a une ligne dans le actionperformed ou tu
    recuperes l'index selectionné de la table:

    si tu selectionnes une ligne (index>0) alors tu effaces
    si aucune ligne est selectionnée alors index == 0 et donc rien ne se passe

    donc aucun bug , le cde fait exactement ce que tu lui dit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void actionPerformed(ActionEvent arg0) {
     
    	if (arg0.getSource() == jButtonDel){
    	int index = jTable.getSelectedRow(); //ici tu recupere l'index da la ligne selectionnée
    	if (index >= 0)
    		jTable.removeRowSelectionInterval(index, index);
    	}
    }

  5. #5
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut
    salut,

    tout dabord, merci de te pencher sur mon problème.

    Mais a mon avis tu as du selectionné la dernière ligne, donc je vais être plus claire.

    Donc en lancant l'application, j'ai 5 Panels
    • Unselect 0
    • Unselect 1
    • Unselect 2
    • Unselect 3
    • Unselect 4


    Si je clic sur Unselect 1, il devient Select 1
    Si j'appui sur le bouton Del, il me reste

    • Unselect 0
    • Unselect 2
    • Unselect 3
    • Unselect 4


    Maintenant si j'appui sur Unselect 2, il devient Select 2
    Si j'appui sur le bouton Del, il me reste

    • Unselect 0
    • Select2
    • Unselect 3


    Alors que par analogie avec le test 1 j'aurais du avoir

    • Unselect 0
    • Unselect 3
    • Unselect 4


    Donc j'ai essayer le meme test en mettant en commentaire les lignes suivantes dans la classe MyJTable pour savoir si les données, elle, était bonnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //setDefaultEditor(MyData.class, new MyTableCellEditor());
    //setDefaultRenderer(MyData.class, new MyTableCellRenderer());
    et je constate qu'en m'etant ces deux lignes en commentaire et en refaisant le même test, ce sont les bonnes données. J'en suis donc venu à la conclusion, que ce sont les panels qui ne sont pas rafraichi.

    Et pour confirmer le test (sans les lignes en commentaire) si je redimentionne ma fenetre, il me met les bonnes données (ou plutot les bon panel), ce qui me confirme ma conclusion.

    Donc y a t'il une solution pour palier à ce problème? parce que la j'ai vraiement l'impression que c'est la JTable qui gère mal ses panels.

    Merci d'avance

  6. #6
    Membre éclairé Avatar de biozaxx
    Profil pro
    Inscrit en
    Août 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 403
    Par défaut
    a oui
    et encore le comportement n'est pas toujours le meme.
    visiblement c'est le DefaultEditor qui fou la grouille, le renderer est correct.

    par contre il y a un truc que je ne pige pas : pourquoi tu n'agis pas directement sur le modele de données ? c'est tout l'interet d'un MVC quand tu as besoin de modifier le contenu, tu tapes sur le modele et il averti la vue (la JTable) automatiquement ...

    je vais essayer de regarder de plus pres ton editor (meme si je ne suis pas convaincu que ce soit la bonne facon de proceder) mais je ne te garantie rien

  7. #7
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut
    Citation Envoyé par biozaxx
    par contre il y a un truc que je ne pige pas : pourquoi tu n'agis pas directement sur le modele de données ? c'est tout l'interet d'un MVC quand tu as besoin de modifier le contenu, tu tapes sur le modele et il averti la vue (la JTable) automatiquement ...
    Oui effectivement, c'est juste un code exemple (moyennement codé d'allieur), mais c'est clair, qu'il vaut mieux agir directement sur le model, sur ce point je suis d'accord.
    Et puis même sur d'autre cas, le code à été écrit à la va vite, c'était juste pour que les internautes puissent comprendre mon véritable problème.

  8. #8
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut
    YEEEEeeeeeesssssss, I Have a solution .

    Je ne sais sais pas si c'est LA solution, mais voila, ca marche quand même.

    En faite lors qu'on utilise les affichages avec les JPanel dans la JTable, il considère que si on change l'affichage (donc ajout ou supression d'un panel), c'est la structure de la table qui change. Du coup il ne faut pas utiliser fireTableRowsDeleted (ou même les autres fireTable...) mais plutot fireTableStructureChanged. Bon ca résou mon problème, mais je trouve ca qd meme tres moyen et tres étrange comme comportement pour une JTable. Mais bon...

    En tout cas je vous remercie tous ,

    @++

Discussions similaires

  1. Panel dans JTable (CellEditor)
    Par Lady dans le forum Composants
    Réponses: 7
    Dernier message: 17/07/2007, 10h50
  2. [JTable] couleur de sélection dans une JTable
    Par spoutyoyo dans le forum Composants
    Réponses: 7
    Dernier message: 06/12/2004, 11h43
  3. Des Panels dans un jScrollPane
    Par cantabile dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 07/08/2004, 12h20
  4. Sélection d'une ligne dans un JTable
    Par dam21 dans le forum Composants
    Réponses: 3
    Dernier message: 28/07/2004, 12h57
  5. Comment copier un Panel dans la PressePapier
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 19/04/2004, 16h45

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