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

JSF Java Discussion :

[rich] TreeNodesAdaptor recursive


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut [rich] TreeNodesAdaptor recursive
    Bonjours,

    Je m'entraine en JSF, je n'ai pas de grande connaissance. j'essaye de faire une hiérarchie récursive. Voici mon code:

    FileSystemBean:
    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
     
    package managedBean;
     
     
    public class FileSystemBean {
        private static String item = "0";
     
        private FileSystemNode[] srcRoots;
     
        public synchronized FileSystemNode[] getSourceRoots() {
            if (srcRoots == null) {
              srcRoots = new FileSystemNode(item,"0").getNodes();
            }
     
            return srcRoots;
        }
    }
    FileSystemeNode:
    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
    52
    53
    54
    55
    56
    57
    58
    59
    package managedBean;
     
    import session.ConnexionBean;
     
    public class FileSystemNode {
        private String item;
        private String mode;
     
        private static FileSystemNode[] CHILDREN_ABSENT = new FileSystemNode[0];
     
        private FileSystemNode[] children;
     
        private String nom_item;
     
        public FileSystemNode() {
     
        }
     
        public FileSystemNode(String item,String mode) {
            this.mode=mode;
            ConnexionBean co = new ConnexionBean();
            this.item =co.loadNewHiel(item,mode);
            if (children == null) {
                  String[] items=this.item.split("\n");
     
                    children = new FileSystemNode[items.length-1];
     
                    for (int i = 0; i < items.length-1; i++) //-1 pour HIELFIN
                    {
     
                        String[] champs=items[i].split("\t");
                        if(champs[5].equals("0"))
                        {
                          children[i] = new FileSystemNode(champs[0],this.mode);
     
                          System.out.println(champs[2]);
                        }
                        else
                        {
                          children[i] = new FileSystemNode();
                        }
                        children[i].setNom_item(champs[2]);
                   }
            }
        }
     
        public synchronized FileSystemNode[] getNodes() {
            return children;
        }
     
        public String toString() {
            return nom_item;
        }
     
        public void setNom_item(String nom_item) {
            this.nom_item = nom_item;
        }
     
    }
    la fonction loadNewHiel me renvoi une ligne pour chaque fils de l'item passer en paramètre. Avec des informations séparées par des tabulation. Cette fonction marche bien.


    PostVackPhaseListener:
    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
    package managedBean;
     
    import java.util.Map;
     
    import javax.faces.context.ExternalContext;
    import javax.faces.context.FacesContext;
    import javax.faces.event.PhaseEvent;
    import javax.faces.event.PhaseId;
    import javax.faces.event.PhaseListener;
     
    public class PostbackPhaseListener implements PhaseListener {
     
        public static final String POSTBACK_ATTRIBUTE_NAME = PostbackPhaseListener.class.getName();
     
        public void afterPhase(PhaseEvent event) {
        }
     
        public void beforePhase(PhaseEvent event) {
            FacesContext facesContext = event.getFacesContext();
            Map requestMap = facesContext.getExternalContext().getRequestMap();
            requestMap.put(POSTBACK_ATTRIBUTE_NAME, Boolean.TRUE);
        }
     
        public PhaseId getPhaseId() {
            return PhaseId.APPLY_REQUEST_VALUES;
        }
     
        public static boolean isPostback() {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            if (facesContext != null) {
                ExternalContext externalContext = facesContext.getExternalContext();
                if (externalContext != null) {
                    return Boolean.TRUE.equals(
                            externalContext.getRequestMap().get(POSTBACK_ATTRIBUTE_NAME));
                }
            }
     
            return false;
        }
     
    }
    TreeDemoStateAvisor:
    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
    package managedBean;
     
    import org.richfaces.component.UITree;
    import org.richfaces.component.state.TreeStateAdvisor;
    import org.richfaces.model.TreeRowKey;
     
    public class TreeDemoStateAdvisor implements TreeStateAdvisor {
     
        public Boolean adviseNodeOpened(UITree tree) {
            if (!PostbackPhaseListener.isPostback()) {
                Object key = tree.getRowKey();
                TreeRowKey treeRowKey = (TreeRowKey) key;
                if (treeRowKey == null || treeRowKey.depth() <= 2) {
                    return Boolean.TRUE;
                }
            }
     
            return null;
        }
     
        public Boolean adviseNodeSelected(UITree tree) {
            return null;
        }
     
    }
    index.xhtml
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:a4j="http://richfaces.org/a4j"
          xmlns:rich="http://richfaces.org/rich"
          xmlns:c="http://java.sun.com/jstl/core" >
        <head>
            <title>TODO supply a title</title>
        </head>
        <body>
     
            <ui:composition>
        <h:form>
            <rich:tree style="width:300px" switchType="ajax" stateAdvisor="#{TreeDemoStateAdvisor}">
                <rich:recursiveTreeNodesAdaptor roots="#{fileSystemBean.sourceRoots}" var="item" nodes="#{item.nodes}" />
            </rich:tree>
        </h:form>
     
    </ui:composition>
     
        </body>
    </html>

    Quand je lance l'application la page index m'envoie ceci:


    Le souci c'est que la récursivité ne marche je devrai obtenir ceci:



    De plus quand je clique sur les répertoires les fils de celui-ci ne disparait pas.

    Je ne vois pas pourquoi la récursivité ne marche ni la fonction pour réduire les nœuds

  2. #2
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Il n'y à pas beaucoup d'aide sur ces fonctions jsf.
    le lien le plus intéressant que j'ai trouvé est http://livedemo.exadel.com/richfaces...faces/tree.jsf
    Mais il ne montre que les fichier jsf et pas les classe java avec les quels il sont utilisés... Je ne trouve aucune doc convenable
    Je suis vraiment débutant et je trouve pas l'erreur
    Si quelqu'un pourrait m'aider svp!!

  3. #3
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    Je trouve que la méthode la plus simple pour afficher un arbre c'est encore d'utiliser des TreeNode. Tu génère ton modèle d'arbre (recursivement ou pas) où chaque noeud de l'arbre est un TreeNode et au niveau de la Jsp l'affichage se fait avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <rich:tree value="#{bean.treeRoot}" var="item" >
        <rich:treeNode>
            <h:outputText value="#{item.name}" />
        </rich:treeNode>
    </rich:tree>
    http://www.jboss.org/file-access/def...rich_tree.html

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    J'ai essayé avec rich:tree mais je vois pas tro ce que je doit mettre dans mes classe java. as-tu un exemple où on voit comment sont faite les classe?

    J'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <rich:tree style="width:300px" value="#{fileSystemBean.sourceRoots}" nodeFace="#{item.nodes}" var="item"> 
              <rich:treeNode type="pere">
                   <h:outputText value="#{item.nodes}" />
              </rich:treeNode>
        </rich:tree>
    Avec mes fonction qui existe déjà. mais ça marche pas ^^'

  5. #5
    Membre éprouvé Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Par défaut
    Dans le code tu créé ton arbre avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TreeNode<Tutu> node = new TreeNodeImpl<Tutu>();
    node.setData(tutu);
    root.addChild(node);
    ...
    Mais ça va impliquer des modifs dans ton code. Apres tu peux toujours essayer de faire marcher ton recursiveTreeNodesAdaptor mais j'ai jamais utilisé donc je peux pas t'aider.

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Pour la récursivité c'est pas important car je sais qu'il y a au max 2 sous fils.
    Dans le code que tu m'a montré c'est pas très explicite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <rich:tree value="#{bean.treeRoot}" var="item" >
        <rich:treeNode>
            <h:outputText value="#{item.name}" />
        </rich:treeNode>
    </rich:tree>
    Si je met ce code sur le .xhtml.
    Je doit créer la fonction treeRoot dans ma classe?
    Et je doit mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TreeNode<Tutu> node = new TreeNodeImpl<Tutu>();
    node.setData(tutu);
    root.addChild(node);
    ...
    Cette fonction doit donc me renvoyer le TreeNode?
    et pour root.addChild(node), D'où vient le root?
    Désolé je connais pas très bien encore le jsf

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

Discussions similaires

  1. [COMPILATION][RECURSIVE] outil ?
    Par narmataru dans le forum Build
    Réponses: 6
    Dernier message: 14/01/2009, 15h05
  2. [C++] Creer des repertoires de facon recursive
    Par barthelv dans le forum Windows
    Réponses: 2
    Dernier message: 25/04/2005, 15h12
  3. Exploitation d'une table possédant une relation recursive
    Par VincentR dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/08/2004, 11h07
  4. Envoi de mail au format Rich-Text
    Par LineLe dans le forum ASP
    Réponses: 4
    Dernier message: 29/10/2003, 16h27
  5. Image et rich edit
    Par :GREG: dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/05/2002, 11h33

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