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 :

jTree : Synchronisation avec le model


Sujet :

Composants Java

  1. #1
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut jTree : Synchronisation avec le model
    Bonjour,

    Je développe actuellement une application qui utilise un jTree. Ce jtree affiche, par l'intermediaire d'un treeModel (une classe à moi qui implémente TreeModel), des objets de ma couche metier (model). L'abre d'objets est formé par une seule classe avec un principe de reflexivité. Actuellement cela fonctionne trés bien mais par contre, les modifications de mon model ne sont pas répercutées sur mon jTree.

    Ce que je voudrais, c'est que dés que le model est modifié (pas forcément par l'intermédiaire du jTree) l'affichage dans le jTree soit automatiquement mis a jour. J'ai cherché des éxemple mais je n'ai rien trouvé qui corresponde à mon besoin. Besoin qui me parait pourtant classique, non ?

    Je vais peut-etre devoir "fire" des évenements au niveau de mes objets metier ? Peut etre que ces évenement vont devoir remonter tout l'arbre de mes objets pour arriver jusqu'a la racine référencée par mon treeModele qui poura alors transmettre l'info au jTree ?? Des objets metiers doivent-ils "fire" des evenements ?? Ne cerai-ce pas une entorse à la logique qui veut que ses objets se contentent de gerer les données metier ?
    En gros, je ne sais pas vraiement dans quel sens aller...

    PS : je fais du Java depuis moins d'un mois, je ne suis donc pas un "expert".

    Si vous pouviez me donner quelques bonnes pistes, ca me ferait gagner un tps précieux.

    Merci 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
    Non c'est le model lui même qui doit envoyer le fire quand ses données internes sont changées.... donc les diverse méthodes d'ajout/supression de ton model doivent faire appel à la méthode fire qui va bien...

  3. #3
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Donc, si j'ai bien compris, je dois enregistrer un listeneur auprés de mon modele et appeler les methodes de ce dernier dans mes objets metiers ?
    Mais je ne peux pas enregistrer un listeneur pour chaque instance de ma classe metier....
    Je pense qu'il va faloir m'en dire un peu plus.... Merci.

  4. #4
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    J'ai trouvé un lien interessant :
    http://java.sun.com/products/jfc/tsc...ree/index.html

    Un peu tendu pour mon niveau mais j'essaye de comprendre...

  5. #5
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Bon, je commence à m'en sortir.

    Voici ma petite contribution, en complément du lien dans mon précédent méssage :
    Le principe est que le TreeModel est secé appeler des méthodes de ses listeneurs pour les avertir des changements.
    Par défaut, le JTree s'enregistre tout seul en tant que listeneur du TreeModel quand on lui assigne.
    Pour ma part, je n'ai pas retouché à mes objets metier. J'ai simplement implémenté des methodes qui modifient le modele dans mon TreeModel qui appel alors les méthodes de mes objets metiers et préviens le JTree pour mettre l'affichage a jour.

  6. #6
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    Il y a encore une petite chose que je n'arrive pas à faire :
    Quand je dois fire un TreeNodesChanged sur ma racine, comme le path doit etre de la racine au parent de la tache concernée, je suis bien obligé de donner un chemin null. Pourtant, ca me genere une erreure dans la console.

    Voici un extrait de mon code (Mes objets métier sont des "Task"):
    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
    	public void setTaskLabel(Task t, String newName){
    		//Ne fait rien si t ou son parent est null
    		if(t==null || t.getParentTask()==null)return;
     
    		//fabrique l'évenement à transmetre à la vue
    		Object[] path = getTaskPath(t);
    		int[] childIndex={t.getParentTask().getSubTasks().indexOf(t)};
    		Object[] child = {t};
    		TreeModelEvent e=new TreeModelEvent(this, path,childIndex,child);
     
    		//Définit le label de la tache
    		t.setLabel(newName);
     
    		//Previens la vue
    		fireTreeNodesChanged(e);
    	}
    	private Object[] getTaskPath(Task t){
    		ArrayList a=new ArrayList();
    		while(t.getParentTask()!=null){
    			t=t.getParentTask();
    			a.add(0, t);
    		}
    		return a.toArray();
    	}
    Du coup, pour le moment, je n'agit que si la tache concernée n'est pas la racine...

    Une idée ?

  7. #7
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Juste une question : tu utilises quoi exactement ? Tu implémentes TreeModel, tu étends DefaultTreeModel ou tu utilises DefaultTreeModel ?

    En utilisant simplement des DefaultMutableTreeNodes et les méthodes d'ajout/suppression de noeuds qui sont codées, les bons événements sont lancés et le JTree réagit. Il ne faut appeler les méthodes fire... uniquement si tu modifies le contenu du TreeModel sans utiliser par une méthode de DefaultMutableTreeNode.
    Le plus pratique est quand même d'utiliser les classes de l'API standard (sauf si ça t'oblige à dupliquer tes données).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  8. #8
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    J'ai :
    public class TreeModelSupport : qui implémente les méthodes qui me permettent d'avertir les listeneurs (pompé sur le lien que j'ai précedement envoyé)

    public abstract class AbstractTreeModel extends TreeModelSupport implements TreeModel : qui est vide.

    public class TaskTreeModel extends AbstractTreeModel : qui implémente les méthode de l'interface TreeModel pour permettre l'affichage de mes objets metiers dans l'arbre. C'est aussi dans cette classe que j'ai défini des méthodes qui me permettent de modifier le model tout en informant le JTree.

    public class TaskTreeCellRenderer extends DefaultTreeCellRenderer : Qui me permet d'utiliser les icones que je veux en fontion de l'état de mes objets. J'affiche aussi avec la couleur définie dans chaque objet Task.

    Ce n'est peut etre pas la méthode la plus simple mais c'est la seule que j'ai trouvé... Existait-il un autre moyens pour utiliser une structure d'objets metier existante sans avoir à la modifier ??

    En tt cas je suis maintenant plustot satisfait. Il y a juste le problème de la mise à jour de la racine qui me manque. En fait je pourais meme m'en passer mais j'aimerais tout de même comprendre...

  9. #9
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Ah ouais, t'as pas fait le petit joueur, là ... J'avais pas regardé ton lien en détail, mais il est intéressant. Le problème, c'est que ton algo dépend de l'utilisation que tu fais de cette classe AbstractTreeModel. Je ne peux pas trop t'aider, vu qu'elle ne fait pas partie de l'API standard.

    Au mieux tu peux faire du debugging (comparer avec un DefaultTreeModel et afficher tous les TreeModelEvents qui passent) pour trouver quel événement est lancé avec des paramètres différents.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #10
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Citation Envoyé par monstroplante
    Du coup, pour le moment, je n'agit que si la tache concernée n'est pas la racine...

    Une idée ?
    Que si la racine n'est pas touché ou que si le noeud n'est pas ouvert ?
    Style tu as deux niveaux hierarchiques : la racine, le niveau 1 et le niveau 2.
    Si la racine et le niveau sont ouvert (visuellement) tu peux lui ajouter des données au niveau 1 et que la mise a jour graphique soit répercutée ?

    J'ai le même problème que toi ! j'ai redéfini AbstractTreeModel pour qu'il puisse travailler avec avec une hiérarchie de List. L'utilisation des TreeNode impliquait une duplication des données que je souhaitais éviter.
    Tu utilises des tableau de ton coté, si j'ai bien compri ?

    Mais le lancement des evenement sur autre chose que des TreeNode c'est assez coton et pour le moment j'ai pas réussi a régler le problème.
    Ca fait longtemps que je ne me suis pas replongé dessus, faudrait que je rejete un oeil !
    Je vais aussi aller lire la doc que tu as donné en lien.

    n!co

  11. #11
    Membre confirmé Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Par défaut
    En fait, mon problème se résume à la fabrication d'un TreeModelEvent (objet évenement transmis aux listeneurs dont le JTree fait partie) dans le cas d'un fire TreeNodesChanged l'orsqu'il s'agit d'indiquer une mise à jour des propriétés du noeud racine.

    Là, rien de spécifique celon moi.

    xavlours, je pense que ta méthode peu effectivement me donner ma réponse. Je testerais ca plus tard mais pour l'instant, je n'ai pas le temps. Au fait, éxite-t-il une méthode permettant d'afficher le contenu d'une variable dans la console. Une sorte d'équivalent de var_dump() en php...

    Pour ceux que cela interesse, je vous joint mon source (c'est du open source ) C'est mon premier programme Java et je ne suis donc pas du tout opposé aux éventuelles critiques constructives...

    http://monstro.homeip.net/pub/sources_java.rar

    ps : c'est du brute en construction...

  12. #12
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Salut !

    As-tu résolu ton problème ? Je me trouve dans la même situation que toi, à savoir comment générer des évènements sur la racine ?

    Je me prends moi aussi une null pointer exception alors que je fais pourtant, il me semble, ce qui est écrit dans la javadoc...

    To create a node changed event for the root node, specify the parent and the child indices as null.
    source : Javadoc sun

Discussions similaires

  1. [Toad Data Modeler] Synchronisation avec la base
    Par fabko dans le forum Autres
    Réponses: 0
    Dernier message: 29/09/2008, 14h38
  2. Problèmes d'affiche du header de mon JTable avec un Model
    Par Baptiste Wicht dans le forum Composants
    Réponses: 16
    Dernier message: 08/02/2006, 18h37
  3. [VB.NET] DataGridView et synchronisation avec une BD
    Par tidan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/02/2006, 11h12
  4. [JTree] Feuille avec CheckBox
    Par redtux dans le forum Composants
    Réponses: 4
    Dernier message: 27/10/2005, 20h11
  5. [JTree] TreeNode avec icon
    Par Breiz-ilien dans le forum Composants
    Réponses: 3
    Dernier message: 05/04/2005, 16h26

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