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 :

remplir un treeNode par reflexivité


Sujet :

avec Java

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut remplir un treeNode par reflexivité
    Bonjour à vous

    Je souhaite remplir un treeNode en utilisant la réflexivité, je m'explique

    J'ai:
    • un objet Parc qui contient un ArrayList<Machine>
    • un objet Machine qui contient un ArrayList<DisqueDur>
    • un objet Machine qui contient un ArrayList<Ecran>


    je souhaiterai pouvoir envoyé un objet quelconque (Parc, Machine) pour remplir un treeNode voila le début mais je n'arrive pas à récupérer les objet contenus dans les ArrayList:

    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
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import javax.swing.tree.*;
     
    public class MethodeGraphique<T> {
     
    	public static TreeNode remplirTreeNode(Object objet) {
    		DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(objet
    				.getClass().getName());
    		Field[] champs = objet.getClass().getDeclaredFields();
    		for (int i = 0; i < champs.length; i++) {
    			if (champs[i].getType() != ArrayList.class)
    				continue;
    			else
    			try {
    				Method m= objet.getClass().getMethod("get"+champs[i].getName());
    				//Object o=objet.getClass().getField(champs[i].getName());
    				Object o=m.invoke(objet);
    				System.out.println(o.toString());
    			} catch (SecurityException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (NoSuchMethodException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalArgumentException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalAccessException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (InvocationTargetException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} 
    		}
     
    		return null;//je ne suis jamais arrivé jusque là
     
    	}
    Comme vous le voyez j'ai essayé aussi de passer par la class Method mais j'obtiens une exception noSuchMethodException, alors que cette méthode existe!!

    Si quelqu'un peut m'aider par cette voie là ou part une autre, juste pour récupérer les objets de mes ArrayLists, afin de faire juste après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (Bidoule bidoule:ListBidoule){
    ....
    Merci

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Il te manque 2 étapes je pense :

    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
    import java.lang.reflect.Field;
     
    public class MethodeGraphique<T> {
     
    	public static void main(String args[])
    	{
    		Parc p = new Parc();
    		TreeNode node = remplirTreeNode(p);
     
    	}
     
    	public static TreeNode remplirTreeNode(Object objet) {
    		DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(objet
    				.getClass().getName());
    		Field[] champs = objet.getClass().getDeclaredFields();
    		for (int i = 0; i < champs.length; i++) {
    			if (champs[i].getType() != List.class)
    				continue;
    			else
    			try {
    				Method m= objet.getClass().getMethod("get"+champs[i].getName());  // Il faut pas oublier le GETTER de test listes. (ou recuperer autrement)
    				//Object o=objet.getClass().getField(champs[i].getName());
    				Object o=m.invoke(objet); // Ici tu as ton arraylist<T>.
    				List list = (List)o;
    				// Ici tu parcours ta liste pour obtenir les fils.
    				for (int j = 0; j < list.size(); j++)
    				{
    					Object son = list.get(j);
    					System.out.println(son.toString());
    				}
     
     
     
    			} catch (SecurityException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (NoSuchMethodException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalArgumentException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalAccessException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (InvocationTargetException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} 
    		}
     
    		return null;//je ne suis jamais arrivé jusque là
     
    	}
    }

    avec pour ma classe Parc :

    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
    public class Parc
    {
    	float toto;
    	List<Machine> Machines = new ArrayList<Machine>();
     
    	Parc()
    	{
    		Machines.add(new Machine());
    		Machines.add(new Machine());
    		Machines.add(new Machine());
    	}
     
    	public synchronized List<Machine> getMachines()
    	{
    		return Machines;
    	}
     
    	public synchronized void setMachines(List<Machine> machines)
    	{
    		this.Machines = machines;
    	}
     
     
     
    }
    Ensuite, il faut rajouter de la recursivité ou faire autrement pour obtenir les fils des fils des fils etc ... pour remplir ton arbre.

    Bonne chance
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut
    Merci,

    J'ai réussi, mais cela donne une méthode assez barbare.

    Tout d'abord je crée une pile dans laquelle je m'étais les classes héritée jusqu'à ce que la classe mère soit "Object"

    Ensuite je dépile, je récupère les méthodes de la classe (j'ai choisi les méthodes plutot que les propriétés).
    Ensuite pour chaque méthode de la classe dépilée, je fais différent traitement en fonction du retour de la méthode (numérique, texte, date, collection).
    Si le retour est une collection je relance la méthode de génération de branche, qui me rajoute une branche (avec ses enfants).
    Grace à ça je peu envoyer un objet dans la méthode et j'obtiens un beau treenode avec tout ce qu'il faut.

    Merci
    Sujet clos

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

Discussions similaires

  1. [MySQL] Remplir un tableau par requêtes sql
    Par Melekitto dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/02/2006, 17h30
  2. Comment remplir un controle par un autre
    Par thoruiz dans le forum Access
    Réponses: 3
    Dernier message: 27/01/2006, 10h57
  3. [VB.NET][PDA]Remplir 2 textbox par liste de valeurs
    Par tostinni dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/12/2005, 21h58
  4. Remplir une Liste par SQL ?
    Par Zigouigoui dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 03/12/2005, 17h08
  5. remplir un Input par rapport à une BD
    Par pmboutteau dans le forum ASP
    Réponses: 10
    Dernier message: 24/08/2005, 10h35

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