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

Java Discussion :

recuperer une instance à partir d'une autre application ou d'un jar


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut recuperer une instance à partir d'une autre application ou d'un jar
    Bien le bonjour à tous.

    Aujourd'hui, je souhaite génerer un JTree contenant toute une arborescence swing. Le truc, c'est que la JFrame (racine de tous les composants swings de l'IHM) se trouve dans une autre application.

    Donc j'aimerai bien une méthode générique pour récuperer une instance de cette JFrame.

    Avez vous des pistes pour m'aider dans ma tache ?

    merci d'avance et bonne journée

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Déplacé ici à la demande du posteur puisque le problème n'est pas fondamentalement restreint à AWT/Swing.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Petit up pour dire que je n'ai pas trouvé la solution

    'fin bon j'ai déja une piste, J'ai testé la méthode newInstance, et j'arrive à instancier n'importe quelle classe référencée dans mon application. Maintenant le souci, c'est soit de parametrer la methode Class.forName(String) pour chopper la JFrame dans mon autre application, soit de pouvoir ajouter le jar à mon buildpath de manière graphique (comprenez comme un "fichier/ouvrir")

    Any ideas ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    J'ai trouvé une solution qui à l'air sympatoche ici.

    Je posterai le code quand ça fonctionnera chez moi

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Si j'ai bien compris ce que tu veux faire, tu as une appli A qui affiche une JFrame, et tu voudrais la récupérer dans un appli B.

    Dans ce cas, les méthodes que tu évoques ci-dessus ne te permettront pas de récupérer la JFrame dans le même état que celui dans lequel elle se trouve dans A.

    Si tu veux récupérer dans B une instance dans le même état que dans A, une solution est de passer par la sérialisation. Jette un coup d'oeil à java.io.ObjectInputStream/ObjectOutputStream. Tu peux utiliser le comportement par défaut ou bien rédéfinir les méthodes readObject() et writeObject(). Tu dois bien être conscient qu'il ne s'agira que d'une copie.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Meci pour les conseils verbose.

    Ta solution est intéressante, mais en fait je n'ai pas besoin d'avoir la JFrame dans le même état, je cherche juste à récuperer la structure hierarchique de cette JFrame (pas besoin de récuperer les champs contenus dans les zones de texte, listes déroulantes etc...).

    Je garde quand même ta solution au chaud

    encore merci

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Bon j'ai encore un soucis. J'utilise un bout de code permettant de rajouter un jar a mon buildpath à l'execution. A priori l'opération se passe bien, mais je n'arrive pas à instancier le moinde objet de mon jar

    Here is da code :

    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
    package app;
     
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
     
    /**
     * This snippet shows how to create a custom class loader and add jars to the
     * classpath at runtime.
     *
     * @author mvohra
     *
     */
    public class RuntimeJarFileLoader extends URLClassLoader {
    	public RuntimeJarFileLoader(URL[] urls) {
    		super(urls);
    	}
     
    	/**
             * add the Jar file to the classpath
             *
             * @param path
             * @throws MalformedURLException
             */
    	public void addFile(String path) throws MalformedURLException {
    		// construct the jar url path
    		String urlPath = "jar:file:" + path + "!/";
     
    		// invoke the base method
    		addURL(new URL(urlPath));
    	}
     
    	/**
             * add the Jar file to the classpath
             *
             * @param path
             * @throws MalformedURLException
             */
    	public void addFile(String paths[]) throws MalformedURLException {
    		if (paths != null)
    			for (int i = 0; i < paths.length; i++)
    				addFile(paths[i]);
    	}
     
    	/**
             * Main method
             *
             * @param args
             */
    	public static void main(String args[]) {
     
    		String classToLoad = "app.NommeurJComponent";
     
    		try {
    			// initialize with empty path
    			URL urls[] = {};
     
    			// create instance
    			RuntimeJarFileLoader loader = new RuntimeJarFileLoader(urls);
    			String jarPath = "D:\\NommageJComponent.jar";
     
    			loader.addFile(jarPath);
     
    			// load the class
    			System.out.println("Avant : " + System.getProperty("java.class.path"));
    			loader.loadClass(classToLoad);
    			System.out.println("Success");
    			System.out.println("Apres : " + System.getProperty("java.class.path"));
     
    			Class classe = Class.forName (classToLoad);
     
    		}
    		catch (Exception ex)
    		{
    			System.out.println("Failed to load : " + ex.getMessage());
    			ex.printStackTrace();
    		}
    	}
    }
    le jar que je charge se trouve bien dans le repertoire D:\NommageJComponent.jar, et la classe que jessaye de récuperer s'appele NommeurJComponent, et se trouve dans le package app.

    Quand je teste ce code, voici ce que j'ai en console :

    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
    Avant : M:\workspace\GenerateurTestSTD\bin
    Success
    Apres : M:\workspace\GenerateurTestSTD\bin
    Failed to load : app.NommeurJComponent
    java.lang.ClassNotFoundException: app.NommeurJComponent
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    	at java.lang.Class.forName0(Native Method)
    	at java.lang.Class.forName(Class.java:169)
    	at app.RuntimeJarFileLoader.main(RuntimeJarFileLoader.java:79)
    L'erreur est levée lorsque j'appele la methode Class.forName (classToLoad). C'est assez étrange car d'une part la méthode loadClass() ne renvoit pas d'erreur, et d'autre part le buildpath que j'affiche avec System.getProperty("java.class.path") n'est pas modifié. Il y a donc anguille sous roche.

    Une âme charitable aurait elle une solution pour m'aider?

    merci d'avance

  8. #8
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Le problème est que même si tu arrive à récupérer l'objet de ton premier jar et à l'instancier dans le second, par le fait que ton instance est un JTree, lorsque tu l'instancira ceci reviendra a instancier un JTree normal (oui le détour est monstrueux ).

    Je te propose deux solutions :
    Soit ton JTree est un sous type de JTree dans lequel tu as ajouté tes informations structurelles statiques dans son constructeur, et dans ce cas je pense que la solution la pus approprié est de créer une librairie dans laquelle le JTree se trouve, puis d'ajouter la lib aux deux projets afin de partager le nouveau type.
    Soit ton JTree est dynamique est tu veux le récupérer tel quel a un instant T, et dans ce cas tu devras passer par sérialisation au travers d'un socket.

    Dans le premier cas, il peut être également avantageur d'avoir un Builder (classe ayant la responsabilité d'initialiser une instance). Dans ce cas tu pourrait avoir une librairie possédant le builder, et tu utiliserait ce builder sur les deux applications afins qu'elle puissent initialiser les deux JTree de la même façon.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Merci pour ta réponse Alain. Ce n'est pas un JTree que je souhaite récuperer, mais une JFrame.

    Concernant tes solutions :
    1) L'utilisateur doit pouvoir récuperer la JFrame sans toucher au code ni créer une librairie. C'est a moi de lui fournir la possibilité de chopper n'importe quelle JFrame de n'importe quelle appli. Les seules choses qu'il doit avoir sont:
    - le jar contenant l'IHM (et donc la JFrame),
    - le package et le nom de la classe contenant cette JFrame,
    - si besoin le nom de la méthode qui permet de récuperer la frame.

    2) La serialisation est une idée interessante, mais je n'ai pas besoin de récuperer cette frame dans un état particulier. De plus cela impose à l'utilisateur d'utiliser un fichier pivot pour récuperer ma JFrame, et j'essaye de lui macher le travail au maximum. J'envisagerai cette solution si je n'arrive vraiment pas à faire marcher le code donné précédemment.

    D'ailleurs en parlant de ça, si quelqu'un à une idée sur le pourquoi du comment ça se fait que ça marche pô, je suis tout ouïe.

    Merchi

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut Yesssss
    J'ai enfin trouvé

    bon déja première remarque, le System.getProperty("java.class.path") ne prend pas en compte le jar ajouté dynamiquement.

    Ensuite j'adresse un grand merci à steph_ch pour son topic que je n'avais pas vu avant malheureusement.
    Pour les gens qui ont le même problème que moi, inspirez vous de son code, il marche très bien

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

Discussions similaires

  1. Appeler une instance à partir d'une autre classe
    Par Anduriel dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 17/12/2011, 11h53
  2. [Batch] Créer une chaine à partir d'une variable et d'une autre chaine
    Par mlle lain dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/11/2009, 16h26
  3. Créer une instance à partir d'une variable ? Possible ?
    Par jpboogie dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 25/04/2009, 09h47
  4. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  5. creation d'une instance à partir d'une string
    Par menuge dans le forum Général Python
    Réponses: 4
    Dernier message: 22/07/2008, 16h24

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