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

Wicket Java Discussion :

Se positonner sur une feuille d'un arbre LinkTree à l'affichage de la page


Sujet :

Wicket Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 173
    Points : 96
    Points
    96
    Par défaut Se positonner sur une feuille d'un arbre LinkTree à l'affichage de la page
    Bonjour la liste,

    J'ai un arbre LinkTree dont la structure est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     -Racine
        |---------- -Noeud1
        |            |----------feuille1.1
        |            |----------feuille1.2
        |---------  +Noeud2
        |---------- feuille3
        |
        |---------
    Actuellement, lorsque j'affiche ma page, l'arbre s'affiche replié (et je dois le déplier si je veux visualiser une information qu'il contiend). J'aimerais qu'à l'ouverture de ma page, que l'arbre soit déplié et par exemple la feuille "feuille1.2" soit visible.

    Je ne sais pas encore comment m'y prendre, quelqu'un aurait une idée ?
    Merci beaucoup d'avance pour votre aide.

  2. #2
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    En considérant que selectedNode est le DefaultMutableTreeNode que tu cherches à atteindre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            getTreeState().selectNode(selectedNode, true);
            TreeNode[] nodes = selectedNode.getPath();
            for (int i = 0; i < nodes.length; i++)
            {
                getTreeState().expandNode(nodes[i]);
            }
    ++

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    J'ai un arbre de type LinkTree et j'aimerais qu'il reste déplié vers la feuille sélectionnée après avoir cliqué sur le lien.
    Pour cela, j'ai surchargé la méthode newTreeState. Je récupère bien le noeud sélectionné (ici: tnProjet) mais la branche ne se déplie pas.


    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
    @Override
    protected ITreeState newTreeState(  )
    {
        ITreeState treeState = new DefaultTreeState(  );
     
        if ( tnProjet != null )
        {
            DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) tnProjet;
            treeState.selectNode( treeNode, true );
     
            TreeNode[] nodes = treeNode.getPath(  );
     
            for ( int i = 1; i < ( nodes.length - 1 ); i++ )
            {
                treeState.expandNode( nodes[i] );
            }
        }
     
        this.updateTree(  );
        this.setRootLess( true );
     
        return treeState;
    }
    J'ai voulu vérifier que le clic fonctionne bien en rajoutant dans ma condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    treeState.expandAll(  );
    Et mon arbre se déplie entièrement quand je clic sur une feuille. Donc mon erreur se trouve dans la condition.

    Quelqu'un aurait-il une idée?
    Merci

  4. #4
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    Bonjour AleXeL

    Petite précision préliminaire : il est préférable d'ouvrir un nouveau sujet, plutôt que de "continuer" un sujet déjà marqué résolu.

    Concernant ta question, je ne comprends pas la surcharge de newTreeState. Pourquoi ne pas avoir repris le code présenté plus haut; à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            getTreeState().selectNode(selectedNode, true);
            TreeNode[] nodes = selectedNode.getPath();
            for (int i = 0; i < nodes.length; i++)
            {
                getTreeState().expandNode(nodes[i]);
            }
    Ce dernier doit être mis dans l'évènement déclenchant le "dépliage" (soit généralement dans un onClick).

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour joseph_p,

    Effectivement, je suis tombé sur ce post en cherchant sur Internet (ce qui m'a poussé à m'inscrire) et le critère "Résolu" ne m'avait pas marqué.
    Je m'en assurerai les prochaines fois.

    Concernant mon problème, j'ai une WebPage qui appelle un Panel contenant mon LinkTree.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WebPage [
        Panel [
            LinkTree
        ] 
    ]
    Je veux déplier mon arbre vers une feuille.
    (Cette feuille est un lien vers une autre WebPage avec la même structure.)
    Quand je clique dessus, je dois garder l'arbre déplié vers la feuille cliquée après chargement de la page sans réinitialiser l'arbre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    add( new PanelLinkTree( "linktree" ) );
    Mon idée était de surcharger newTreeState (Je conserve le TreeNode sélectionné au moment du clic) pour que le chemin se déplie au moment du chargement.
    J'ai vérifié que le chemin soit bien conservé et que newTreeState s'exécute bien au moment du chargement de la page.
    Mais mon chemin ne s'étend pas pour autant.

    Je me demandais si mon problème ne venait pas de la version de WICKET (version 1.3.6) que j'utilise?
    Pour ma part, je n'ai trouvé aucun bug sur ASF JIRA là-dessus.


    Pour l'info, j'ai créé 2 boutons de type AjaxLink:
    • Pour étendre tout l'arbre [Ok]
    • Pour étendre le chemin conservé après le clic [NOk]

  6. #6
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    Re

    De façon générale, surtout si on débute avec Wicket, autant aller vers la dernière version.

    Ceci dit, le composant LinkTree est assez vieux et, en fait, certains sont en train de le "revoir" dans la mesure où il s'appuie sur des éléments de Swing (comme le DefaultMutableTreeNode). Ces éléments swing complexifient inutilement l'actuel LinkTree. Pour info, la version retravaillée est là : wicket-tree.

    Pour en revenir au problème présent, je serai surpris d'un bug dans le LinkTree perso. Quoiqu'il en soit, pour "prouver" la chose il faudrait un "quickstart" modifié afin de reproduire le problème. Si cela était fait, je pourrai également avoir une base plus concrète pour aider : actuellement j'ai du mal à comprendre précisément le problème.

    Quoiqu'il en soi, essayons

    Le problème concerne t il l'ouverture partielle de l'arbre lors de son premier affichage (donc sur une nouvelle page) ? Ou est ce plutôt l'ouverture partielle de l'arbre suite à un clic quelque part ?
    => AMHA, le bout de code que j'ai donné devrait constituer une bonne base dans ces deux cas.

    Concernant le newTreeState, je ne comprends pas bien l'usage qui en est fait. En effet, en regardant où cette méthode est appelée, on peut lire :
    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
     
    	/**
             * Returns the TreeState of this tree.
             * 
             * @return Tree state instance
             */
    	public ITreeState getTreeState()
    	{
    		if (state == null)
    		{
    			state = newTreeState();
     
    			// add this object as listener of the state
    			state.addTreeStateListener(this);
    			// FIXME: Where should we remove the listener?
    		}
    		return state;
    	}
    Autrement dit, newTreeState n'est appelé que pour initialiser. Si l'arbre est déjà construit et que, suite à un clic, on aimerait voir son état changer, alors newTreeState ne me semble pas approprié...

    Au final, un exemple un peu plus concret du problème (permettant de le reproduire) est vraiment bienvenu

    cordialement,
    joseph

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Re,

    Dans mon cas, mon problème concerne l'ouverture partielle de l'arbre lors de son premier affichage sur une nouvelle page.

    A chaque initialisation d'une nouvelle page (action réalisée après un clic sur une feuille de l'arbre), j'obtiens l'arbre replié.
    En effet, j'appelle le constructeur avec l'état par défaut dans chaque WebPage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    add( new PanelLinkTree( "linktree" ) );
    J'essaie de faire en sorte qu'il conserve son état précédent.
    > J'arrive à conserver le TreeNode sélectionné après affichage de la page suivante.
    > Il me reste à déplier le chemin de l'arbre vers cette feuille à l'initialisation de la page

    Par contre, je travaille sur un projet déjà existant qui utilise la version 1.3.6 de WICKET.
    La migration vers la dernière version n'est pas encore à l'ordre du jour.
    Je suis bien d'accord, un bug dans le LinkTree me surprendrait beaucoup.

    Cordialement,
    AleXeL

  8. #8
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    ok, c'est plus clair

    vu que je suis un poil short en temps, voici un rapide copier/coller d'un bout de code faisant ce qui est demandé : ouvrir un node précis lors du 1er affichage.

    Pour ce faire, la fonction suivante est appelée dans mon constructeur, donc dans une classe héritant LinkTree :
    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
     
     private void openSelectedNodeBranch(final DefaultMutableTreeNode selectedNodeOrNull,
                final DefaultMutableTreeNode rootNode)
        {
            DefaultMutableTreeNode selectedNode;
            if (selectedNodeOrNull == null)
            {
                selectedNode = rootNode;
            }
            else
            {
                selectedNode = selectedNodeOrNull;
            }
     
            getTreeState().selectNode(selectedNode, true);
            TreeNode[] nodes = selectedNode.getPath();
            for (int i = 0; i < nodes.length; i++)
            {
                getTreeState().expandNode(nodes[i]);
            }
    }
    cela répond t il au besoin ?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Théoriquement ça doit y répondre mais j'ai toujours l'arbre replié dans la nouvelle page.

    En suivant ton modèle j'ai créé une classe GestionTreeView héritant de LinkTree.
    J'y ai intégré la fonction de ton code.
    Après, je l'appelle dans mon Panel de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import com...GestionTreeView;
     
    // Creation du model pour l'arbre
    final TreeModel treeModel = convertToTreeModel( arbo );
     
    // Creation de l'arbre avec les branches associees
    tree = new GestionTreeView( "tree", treeModel ) { ... };
    this.setLinkTree( tree );
    add( tree );
     
    if ( tnProjet != null ) {
        tree.openSelectedNodeBranch( tnProjet, (TreeNode) treeModel.getRoot(  ) );
    }
    J'ai simplement remplacé les paramètres DefaultMutableTreeNode de la fonction par des TreeNode pour les parser dans la fonction même.
    Y a-t-il une autre opération à effectuer?

    Cordialement,
    AleXeL


    PS: Est-ce vraiment nécessaire d'appeler la fonction selectNode?

  10. #10
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    Bonjour AleXeL

    Je ne suis pas excessivement familier avec le LinkTree, il me faudrait donc faire une démo : je propose de faire cela ce soir (pas le temps avant). Là encore, un exemple tournant du problème aiderait beaucoup, à défaut je ferai ce qui me semble le plus proche.

    Si une réponse plus rapide est souhaitée, il y a toujours la "communauté" wicket, certes anglophone, dont la mailing list et le chat sont généralement très réactifs.

    ++
    joseph

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Résolu
    J'ai fini par trouver une solution à mon problème.
    1. Je récupère les index de chaque TreeNode (qui mène vers la feuille).
    2. Je les ajoute dans une liste.
    3. Ensuite je m'appuie sur le modèle de l'arbre.


    Mon code se présente de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void openSelectedNodeBranch( List<Integer> listIndex, TreeModel treeModel )
    {
        DefaultMutableTreeNode parent = (DefaultMutableTreeNode) treeModel.getRoot(  );
     
        for ( int i = 0; i < listIndex.size(  ); i++ )
        {
            getTreeState(  ).expandNode( parent );
            nodeExpanded( parent );
            parent = ( (DefaultMutableTreeNode) treeModel.getChild( parent,
                                                                        listIndex.get( i ) ) );
        }
     
        updateTree(  );
    }
    Je te remercie pour toute ton aide et tes explications.

    Cordialement,
    AleXeL

  12. #12
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 1 374
    Points
    1 374
    Par défaut
    Citation Envoyé par AleXeL Voir le message
    J'ai fini par trouver une solution à mon problème.
    Excellent ! Alors, quelles impressions du LinkTree ?

    Citation Envoyé par AleXeL Voir le message
    Je te remercie pour toute ton aide et tes explications.
    J'ai pas l'impression d'avoir fait grand chose lol

    Quoiqu'il en soit, content d'avoir aidé.

    Bonne continuation
    joseph

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

Discussions similaires

  1. Exception lors d'un clic sur une feuille d'un arbre
    Par gerudo dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2009, 09h59
  2. Réponses: 1
    Dernier message: 22/07/2008, 17h05
  3. Réponses: 3
    Dernier message: 27/11/2005, 17h59
  4. (EXCEL) Effacer des images gif insérées sur une feuille ?
    Par romo3 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/08/2005, 21h31

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