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

avec Java Discussion :

String et JTree


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    eternel apprenti en informatique
    Inscrit en
    Juillet 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : eternel apprenti en informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 31
    Par défaut String et JTree
    Bonjour a tous
    J'aimerai savoir si il est possible de créer une JTree a partir d'une chaîne de caractère
    On imagine que la chaîne de caractère ressemble a une table de matière où un fils est déterminé par une tabulation
    (pour mon cas les fils sont déterminé par un certain nombre d'espace)

    J'avais pensé faire une methode getJTree() récursive qui retournerait un DefaultMutableTreeNode
    et une autre fonction creationArbre() qui crée l'arbre(la JTree) a partir de getJTree()
    voici mes méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static JTree creationArbre(int i){
    		JTree myTree;	
    		DefaultMutableTreeNode pere=getJTree(i,new DefaultMutableTreeNode (getIntitule(i)));
    		//getIntilule retourne l'intitule du titre de ma table des matiére contenu a la ligne i
    		return myTree=new JTree(pere);
     
    	}

    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
    public static DefaultMutableTreeNode getJTree(int i, DefaultMutableTreeNode pere){
     
    		if(pere.isRoot()){
    			DefaultMutableTreeNode nFils=new DefaultMutableTreeNode(getIntitule(i+1));
    			nFils.add(getJTree(i+2,nFils));
    			pere.add(nFils);
    			//DefaultMutableTreeNode nomPere= new DefaultMutableTreeNode(getIntitule(j));
    			//DefaultMutableTreeNode nomFils= new DefaultMutableTreeNode(getIntitule(i+1));
    			//nomPere.add(getJTree(i,j+1));
    			return pere;
    		}
    		else{
    			DefaultMutableTreeNode nFils=new DefaultMutableTreeNode(getIntitule(i));
    			DefaultMutableTreeNode nPere= (DefaultMutableTreeNode) nFils.getParent();
    			if(numArbo(getIntitule(i+1))==numArbo(getIntitule(i))){
                            //numArbo() compte le nombre de d'espace ou de tabulation contenu dans l'intitule de la ligne
    				return getJTree(i+1,nPere);
    			}
    			else{
    				if(numArbo(getIntitule(i+1))<numArbo(getIntitule(i))){
    					return getJTree(i-1,nPere);
    				}
    				else{
    					pere.add(nFils);
    					return getJTree(i-1,nPere);
    				}
    			}
    		}
    le seul resulta potable que j'obtient c'est le noeud racine suivi d'un seul noeud fils
    J’espère que vous avez compris mon problème
    j'aimerai savoir si c'est possible d'entreprendre ce que je souhaite faire?
    Enfin si non, il y aurait t il une autre maniére

    Merci pour toute réponse

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    J'ai l'impression que ton programme est plus complexe que ton problème en lui-même.

    Tu devrais nous montrer un exemple de ton fichier / texte d'entré.
    Si on suppose le texte t'entré suivant
    10 -- 5;
    5 -- 1;
    5 -- 7;
    7 -- 6;
    7 -- 9;
    10 -- 20;
    20 -- 18;
    20 -- 23;
    23 -- 21;
    On peut imaginer le pseudo-code suivant :

    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 Tree createTree(Sting text) {
    String[] liens  = text.split("\n");
    Tree root = new Tree();
    for(String lien : liens){
    addNode(lien, tree);
    }
     
    }
     
    public void addNode(String lien,Tree tree) {
    Node parent = findOrCreete(lien.split(" -- ")[0], Tree);
    Node enfant = new Node(lien.split(" -- ")[1]);
    parent.add(enfant);
    }
    Après, il faut s'adapter au format du fichier et voir les détails d'implémentation. Mais, cela devrait rester de cette complexité.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre averti
    Homme Profil pro
    eternel apprenti en informatique
    Inscrit en
    Juillet 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : eternel apprenti en informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 31
    Par défaut
    Ma chaine de caractére serait plutot de cette ordre:

    Les saisons
    ---Printemps
    ------Mars
    ---------Les fleurs bourgeonnent
    ------Avril
    ------Mai
    ---Ete
    ------Juin
    ---------Voila les beaux jours
    ------Juillet
    ------Aout
    ---Automne
    ------Septembre
    ---------Rentree des ecoliers
    ------Octobre
    ------Novembre
    ---Hiver
    ------Décembre
    ---------On attend la neige
    ------Janvier
    ------Février
    où les "-" s'apparente a des espace ou des tabulations

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Voilà ma solution, non récursive :

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    import java.util.Arrays;
    import java.util.List;
    import java.util.Stack;
     
     
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.TreeNode;
     
     
    public class TreeFactory {
     
        /**
         * @see #addTreeNode(List, char, int, boolean, DefaultMutableTreeNode)
         */
        public TreeNode createTreeNode(List<String> treeDef,
                char depthPrefix, int tabLength) {
            return addTreeNode(treeDef, depthPrefix, tabLength, false, null);
        }
     
        /**
         * Créer un modèle d'arbre à partir de la définition spécifiée (une liste de
         * valeur pour chaque node, précédé d'un nombre de tabulation déterminant la
         * profondeur du node)
         * 
         * @param treeDef
         *            définition
         * @param depthPrefix
         *            le caractère utilisé pour définir les tabulations
         * @param tabLength
         *            le nombre de caractères pour une tabulation (doit être > 0)
         * @param allowEmptyNodes true si on autorise les descentes de plus d'un niveau
         * @param rootNode
         *            un node dans lequel ajouté les nodes créés, ou null pour faire
         *            un nouvel arbre
         * @return toujours un node non null, qui contient les nodes créés à partir
         *         de la définition
         */
        public TreeNode addTreeNode(List<String> treeDef,
                char depthPrefix, int tabLength, boolean allowEmptyNodes, DefaultMutableTreeNode rootNode) {
     
     
            if (tabLength <= 0)
                throw new IllegalArgumentException("tabLength must be > 0");
     
     
            // on utilise toujours un node root (on peut avoir plusieurs nodes de niveau 0 dans treeDef)
            if (rootNode == null) {
                rootNode = new DefaultMutableTreeNode("");
            }
            if (treeDef == null || treeDef.isEmpty()) {
                return rootNode; // si pas de définition on retourne la racine
            }
     
     
            DefaultMutableTreeNode currentParentNode = rootNode; // le node courant dans lequel on ajoute des nodes de nivea uinférieur
     
            Stack<DefaultMutableTreeNode> stack = new Stack<>(); // pile pour gérer l'arborescence (la remontée surtout)
     
            stack.push(currentParentNode);
            int currentDepth = 0; // on considère qu'on démarre au niveau 0
            for (String def : treeDef) {
     
     
                // on calcul la différence de niveau avec le node précédemment ajouté
                int itemDepth = 0;
                for (int i = 0; def.charAt(i) == depthPrefix && i < def.length(); i++) {
                    itemDepth++;
                }
                int depthDiff = currentDepth - itemDepth;
                if (depthDiff % tabLength != 0) {
                    throw new IllegalArgumentException(String.format("Bad tabulation length (must be multiple of %d) in \"%s\"", tabLength, def)); // on peut faire une exception spécifique
                }
                depthDiff /= tabLength; // nombre de niveau qu'on descend ou monte
                if ( !allowEmptyNodes && depthDiff<-1 ) {
                    throw new IllegalArgumentException("Depth is growing too much (> 1)"); // on peut faire une exception spécifique
                }
     
                String item = def.substring(itemDepth); // valeur de l'item sans les tabulation
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(getItemValue(itemDepth, item)); // on créé le nouvel item
     
                if ( depthDiff<0 ) { // on descend
                    // le nouveau node doit être ajouté à un niveau inférieur du précédent node, soit dans le dernier fils du parent actuel
                    DefaultMutableTreeNode lastSiblingNode; 
                    if ( currentParentNode.isLeaf() ) { // pas de fils encore, on en créé un vide
                        lastSiblingNode = new DefaultMutableTreeNode( getEmptyNodeItemValue() );
                        currentParentNode.add(lastSiblingNode); 
                    }
                    else {
                        lastSiblingNode = (DefaultMutableTreeNode) currentParentNode.getLastChild();
                    }
                    for( int i = -depthDiff-1; i>=0 ; i--) {
                        stack.push(currentParentNode); // on stocke tout nouveau niveau dans la pile, pour pouvoir remonter au bon node plus tard
                        currentParentNode = lastSiblingNode;
                        if ( i==0 ) {
                            // niveau inférieur atteint
                            currentParentNode.add(newNode);
                        } else {
                            // dans ce cas, on est descendu de plusieurs niveau : on intercale des nodes vides
                            lastSiblingNode = new DefaultMutableTreeNode( getEmptyNodeItemValue() );
                            currentParentNode.add(lastSiblingNode);
                        } 
                    }
                    currentDepth = itemDepth; 
                } else if ( depthDiff>0) { // on remonte
                    for (int i = depthDiff-1; i >= 0; i--) { // on remonte d'un niveau de moins, parce que le currentParentNode est le parent du niveau actuel
                        currentParentNode = stack.pop(); 
                    }
                    currentParentNode.add(newNode); // on ajoute le nouveau node
                    currentDepth = itemDepth; 
                } else {// même niveau 
                    currentParentNode.add(newNode); // on ajoute le nouveau node
                }
            }
            return rootNode;
        }
     
        /**
         * En redéfinissant cette méthode, on générer des objets différents, pour représenter les nodes
         * 
         * @param itemDepth prodondeur de l'item
         * @param item texte du node
         * @return valeur pour un node
         */
        protected Object getItemValue(int itemDepth, String item) {
            return item.trim();
        }
     
        /**
         * Génére la valeur utilisée pour faire des nodes de remplissage
         * 
         * @return valeur pour un node vide
         */
        protected Object getEmptyNodeItemValue() {
            return "...";
        }
     
        public static void main(String[] args) {
     
            String[] treeDef = { "Les saisons", 
                                 "---Printemps", 
                                 "------Mars",
                                 "---------Les fleurs bourgeonnent ", 
                                 "------Avril",
                                 "------Mai", 
                                 "---Ete", 
                                 "------Juin",
                                 "---------Voila les beaux jours", 
                                 "------Juillet",
                                 "------Aout", 
                                 "---Automne", 
                                 "------Septembre",
                                 "---------Rentree des ecoliers", 
                                 "------Octobre",
                                 "------Novembre", 
                                 "---Hiver", 
                                 "------Décembre",
                                 "---------On attend la neige", 
                                 "------Janvier", 
                                 "------Février" 
                               };
     
            TreeNode tree = new TreeFactory().createTreeNode(
                    Arrays.asList(treeDef), '-', 3); 
     
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
            JTree jtree=new JTree(tree);
            jtree.setRootVisible(false);
            jtree.setShowsRootHandles(true);
            jtree.setExpandsSelectedPaths(true);
     
            for (int i = 0; i < jtree.getRowCount(); i++) {
                jtree.expandRow(i);
            }
     
            frame.getContentPane().add(new JScrollPane(jtree));
            frame.setSize(300, 450);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
     
        }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    eternel apprenti en informatique
    Inscrit en
    Juillet 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : eternel apprenti en informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 31
    Par défaut
    merci a Joel.drigo et Patrick Kolodziejczyk pour vos reponses.
    Comme je l'ai ecrit precedemment il s'agit d'une seul chaine de caractere qui a la forme donné precedemment et nom d'un tableau de String.
    C'est pourquoi dans mon code je fait un traitement sur le retour chariot '\n' puis sur le '-'

    Pour vous indiqué comment marche ma mèthode getIntitule():
    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
    	 * Obtient l'intitule placé à la iéme ligne de l'objet Saison
    	 * @param ligne
    	 * @return Intitule
    	 */
    	public static String getIntitule(int ligne){
    		Saison saisonHemisphereNord = new Saison();
     
    		int arret = show2(saisonHemisphereNord).length();
                    //show2() permet de voir saisonHemisphereNord sous forme de String
    		int numLigne=0;
    		int indexdebut=0;
    		int a=0;
    		StringBuffer IntituleBuffer = new StringBuffer("");
     
    		do{
    			if(show2(formationLMI).charAt(a)=='\n'){
    				numLigne++;
    			}
    			a++;
    			indexdebut=a;
    		}while(ligne!=numLigne);
     
    		int b=0;
    		do{
    			IntituleBuffer.append(show2(saisonHemisphereNord).charAt(indexdebut+b));
    			b++;
    		}while(show2(saisonHemisphereNord).charAt(indexdebut+b)!='\n');
    		return IntituleBuffer.toString();
    	}
    Voila j’espère que ça va un peu éclairer les personnes qui veulent m'aider.
    PS: je ne suis pas borné si il existe des méthodes autres que récursive, je comprend mais j'ai l'impression que c'est plus simple ainsi!!(je me trompe peut-être)
    Celle de joel semble bonne sauf qu'il utilise un tableau de String or ce n'est pas ici mon cas de figure! Je vais quand même chercher si je peut la modifier

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Tu n'as qu'a convertir ta chaîne unique en tableau de String (Un coup de split())...

    La méthode recursive n'est pas plus simple si elle prend en compte tout les aspects que ma méthode prend en compte : j'utilises juste une stack en plus, pour simuler la récursivité.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Mettre la branche d'un JTree dans un tableau ou un String
    Par persé dans le forum Composants
    Réponses: 1
    Dernier message: 03/05/2013, 09h50
  2. Création JTree à partir d'un tableau de String[][]
    Par benZ31 dans le forum Composants
    Réponses: 0
    Dernier message: 17/04/2009, 09h41
  3. ajoute de type string jtree
    Par spiderams dans le forum Frameworks Web
    Réponses: 0
    Dernier message: 22/03/2009, 16h22
  4. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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