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 :

[JTreeTable/JTable] getValueAt appelée nul part


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut [JTreeTable/JTable] getValueAt appelée nul part
    Bon, je me prends la tête depuis ce matin sur un problème lié aux JTreeTable/JTable. J'utilise la 2e version de Sun. Dedans, il y a une fonction getValueAt() dans la classe FileSystemModel2 qui permet de récupérer les valeurs à un endroit donné dans la table. Seulement mon problème, c'est que cette méthode n'est appelée nul part et qu'elle est pourtant utilisée. J'ai juste mis un affichage du mot test en console et celui-ci apparaît de nombreuses fois donc je suppose que cette fonction est appelée à chaque fois qu'il faut remplir une cellule du tableau. Mais ce qui me chagrine, c'est qu'elle n'est appelée nul part ; j'ai regardé toutes les classes et elle n'apparait que deux fois : une fois dans l'interface et une autre dans la classe qui implémente cette interface (et la classe FileSystemModel2 est une sous-classe de celle qui implémente).
    Donc je ne comprends pas ce qui se passe surtout que j'ai besoin de faire des tests sur des cellules spécifiques de ma JTreeTable et que le getValueAt se fait sur un node et une colonne et non pas une ligne et une colonne

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Aaaaah les JTreeTable... Que de bons souvenirs
    Qu'est ce que j'en ai ch*** là-dessus

    En fait quel est ton problème? Le fait que getValueAt() soit appelé ou le fait que tu veuilles te créer une méthode getValueAt() qui prenne en paramètre un numéro de ligne et de colonne au lieu d'un node et d'un colonne?

    Pour le 2ème problème, tu as normalement la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public Object getValueAt(int row, int column) {
    		return treeTableModel.getValueAt(nodeForRow(row), column);
    	}
    dans la classe TreeTableModelAdapter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    Et bien tu as résumé parfaitement mes deux problèmes
    D'une part je ne comprends pas pourquoi getValueAt est appelée et d'autre part, j'ai trouvé la méthode dont tu ne parles mais je ne sais pas comment l'appeler (vu qu'il y a plusieur getValueAt de définies parmi les différentes classes).

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    1) D'après ce que j'ai compris, la méthode getValueAt() est appelée à chaque fois que ton appli a besoin d'accéder au contenu de ta cellule : que ce soit un accés à une valeur, mais aussi pour un repaint (ce qui veut dire déplacement de colonne, sélection de ligne, et autre), etc...
    Du coup, c'est normal qu'elle soit appelée très souvent.

    2) Pour appeler la méthode getValueAt() du TreeTableModelAdapter, récupère le modèle de ta JTreeTable, caste-le en TreeTableModelAdapter et appelle ta méthode.
    Et normalement, le tour est joué

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    1) ok. Le seul truc, c'est que j'ai fait des colonnes avec des besoins spécifiques et le fait qu'il reload plein de fois, ça provoque une augmentation du temps d'affichage non négligeable. C'est pour ça que j'aimerais bien récupérer les valeurs à un endroit précis du tableau.

    2) Y'a un problème : le modèle de la JTreeTable est un FileSystemModel2 que je ne peux pas caster en TreeTableModelAdapter. Je ne peux que le caster en AbstractTreeTableModel et ce dernier, je ne peux pas non plus le caster en TreeTableModelAdapter donc je me retrouve à la situtation de départ.

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    2) Rajoute cette méthode dans ton FileSystemModel2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        public Object getValueAt(int row, int column) {
    	return treeTableModel.getValueAt(nodeForRow(row), column);
        }
    1) J'avais le même problème
    Je calculais à chaque "refresh" toutes les donénes à afficher.
    En fait, il faut que tu stockes toutes les données à afficher dans ta classe FileNode (ou la classe correspondant dans ton appli).
    Comme ça, tu ne calcules les données qu'une seule fois, et tu ne fais qu'y accéder lors des appels à getValueAt()

    Moi, ça m'a fait gagner un temps fou au niveau du rafraîchissement et du parcours de ma table.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    Bon, y'a de nets progrès
    1) J'ai fait comme tu as indiqué et c'est vrai que ça va bien plus vite de calculer dans le filenode et ensuite de faire des appels aux valeurs déjà calculées.

    2) Là, je rencontre encore un souci. Je ne sais pas si c'est volontaire mais tu as écrit sans majuscule à treeTableModel et du coup, j'ai une erreur de type undefined. Si je mets TreeTableModel, il me sort un problème de référence non statique à la méthode getValueAt de TreeTableModel et je ne peux pas la mettre en statique dans la classe en question (seulement public et abstract sont autorisés). Donc y'a comme un souci de ce coté :/ Et il est important pour moi car j'ai rendu des cellules éditables, qui le sont mais qui ne prennent pas en comptes les changements (les cellules reviennent à leur valeur initiale) et pour ça, je dois aussi définir la méthode setValueAt().

  8. #8
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par Zanton
    Bon, y'a de nets progrès
    1) J'ai fait comme tu as indiqué et c'est vrai que ça va bien plus vite de calculer dans le filenode et ensuite de faire des appels aux valeurs déjà calculées.
    Content de voir que tu progresses, et de voir que les heures que j'ai passé à m'arracher les cheveux sur ce JTreeTable servent à quelque chose

    Citation Envoyé par Zanton
    2) Là, je rencontre encore un souci. Je ne sais pas si c'est volontaire mais tu as écrit sans majuscule à treeTableModel et du coup, j'ai une erreur de type undefined. Si je mets TreeTableModel, il me sort un problème de référence non statique à la méthode getValueAt de TreeTableModel et je ne peux pas la mettre en statique dans la classe en question (seulement public et abstract sont autorisés). Donc y'a comme un souci de ce coté :/ Et il est important pour moi car j'ai rendu des cellules éditables, qui le sont mais qui ne prennent pas en comptes les changements (les cellules reviennent à leur valeur initiale) et pour ça, je dois aussi définir la méthode setValueAt().
    J'ai bien écrit avec une minuscule. Moi, ma classe TreeTableModelAdapter qui possède cette méthode possède un attibut "treeTableModel" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class TreeTableModelAdapter extends AbstractTableModel {
    	JTree tree = new JTree();
    	TreeTableModel treeTableModel;
    	/** Used to display chosen icons for each type of node 
             * (leaf, expanded folder, collapsed folder)
             */
    	MyTreeRenderer myRenderer = new MyTreeRenderer();
    Et j'ai pas calculé que dans FileSystemModel2, il n'y avait pas cet attribut...

    En fait, le truc à comprendre, c'est que la classe TreeTableModelAdapter sert d'intermédiaire entre le modèle de ta JTable et de ton JTree (contenu dans ta JTable).
    Il permet de faire le lien entre les 2 modèles.
    C'est pour ça que dans le contructeur de ta JTreeTable, tu as cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	// Install a tableModel representing the visible rows in the tree. 
    	super.setModel(new TreeTableModelAdapter(treeTableModel, tree));
    Le modèle de ta JTreeTable est en fait un TreeTableModelAdapter construit à partir de ton FileSystemModel2.

    Du coup, tu as accés aux méthodes de TreeTableModelAdapter depuis ta JTreeTable, en faisant du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((TreeTableModelAdapter) taJTreeTable.getModel())...
    Tu peux donc normalement utilisé la méthode getValueAt(row, col) de la classe TreeTableModelAdapter...

    Préviens-moi si j'ai dit une bêtise ou si ça ne fonctionne pas (je te dis tout ça plus ou moins de mémoire...)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    Merci pour toutes tes explications, j'étais à peu près arrivé à des conclusions similaires mais là, ça précise bien les choses

    Cependant, j'ai un problème avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((TreeTableModelAdapter) taJTreeTable.getModel())
    En fait, je ne vois pas comment je dois m'en servir
    Là, je recupere le model de ma jtreetable et je le caste en treetablemodel. Je crois que c'est juste un problème de syntaxe mais je ne sais pas comment on fait pour faire appel du coup à getValueAt() par exemple.

  10. #10
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Comme je te le disais, dans le constructeur de ta JTreeTable, tu as cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Install a tableModel representing the visible rows in the tree. 
    super.setModel(new TreeTableModelAdapter(treeTableModel, tree));
    Donc au lieu de caster ton modèle en TreeTableModel, caste-le en TreeTableModelAdapter...

Discussions similaires

  1. un envoi de mail PHP qui ne marche PRESQUE nul part
    Par laurentSc dans le forum Langage
    Réponses: 15
    Dernier message: 02/05/2011, 19h09
  2. segfault sorti de nul part
    Par nocta dans le forum Débuter
    Réponses: 9
    Dernier message: 13/10/2010, 10h43
  3. Problème d'événements sortis de nul part
    Par coldrink dans le forum SDL
    Réponses: 1
    Dernier message: 23/05/2009, 19h25
  4. problème JTable getValueAt(int,int)
    Par trin86 dans le forum Composants
    Réponses: 8
    Dernier message: 16/02/2009, 20h29
  5. Réponses: 3
    Dernier message: 29/05/2008, 19h58

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