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

Langage Java Discussion :

jar et Composant


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut jar et Composant
    Bonjour,

    Voici la question,

    ECLIPSE : un projet , un package

    2 fichiers dans le package: Fenetre.java (JFrame) et Panneau.java (Jpanel)

    Dans Fenetre : instanciation de Panneau : Panneau pan = new Panneau() --> OK

    JPanel container = new JPanel();
    container.add(pan, BorderLayout.CENTER); ---> OK

    le problème se pose quand je transforme Panneau en .jar , je le sors du package en le plaçant à la racine du projet

    Je ne parviens plus à le récupérer et à instancier Panneau ds Fenetre

    J'ai fait des recherches multiples (ClassLoader, ...) mais je m'en sors pas ...

    Merci de votre collaboration

  2. #2
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    La question c'est surtout, Pourquoi faire ça ? Dans quel but souhaites tu créer un .jar de cette classe ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Pourquoi faire çà
    L'idée est de simuler l'ajour d'une librairie .

    J' ai compilé manuellement Panneau.java.

    Transformation en Panneau.jar

    Puis ensuite, ajout par add external Jars ... vpolà

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu n'as probablement pas respecté correctement le packaging.


    Dans le jar, les .class doivent se trouver dans un sous dossier qui correspond à la directive package du même fichier java.


    Ainsi, si tu as

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    package truc.bidule;
    public class Panneau {....}
    Tu dois, dans ton jar, avoir un truc/bidule/Panneau.class

    Et je suppose que ce n'est pas le cas ici.

    Dans le doute, montre nous panneau.java, le contenu du jar (hierarchie) ainsi que la manière dont tu l'utilise dans ton deuxième projet java.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Bonjour Tchize
    le but de cet essai est un test : constituer une librairie exploitable par tous (je n'ai pas cette ambition ... c'est un test)

    J' ai donc enlevé la référence package de Panneau.java quand j'ai refait la compil manuellement

    dans Fenetre.java, j'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     URL urlList[] = {new File("./Panneau.jar").toURI().toURL()};
     
    	   ClassLoader loader = new URLClassLoader(urlList);
     
    	   String Name = "Panneau";
    	   Object o = Class.forName(Name,true,loader).newInstance();
    çà marche mais ... je ne sais trop quoi faire avec ... je dois ensuite instancier

    Panneau pan = new Panneau qui me servira ds
    container.add(pan, BorderLayout.CENTER);

    Il n' a pas de code complexe , c'est simplement pour bien comprendre le fonctionnement des librairies
    Voici les codes

    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
     
    package pack;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.io.File;
    import java.net.URL;
    import java.net.URLClassLoader;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class Fenetre extends JFrame {
     
      private Panneau pan = new Panneau();
      private JPanel container = new JPanel();
     
      public Fenetre(){
        this.setTitle("Animation");
        this.setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
     
        container.setBackground(Color.white);
        container.setLayout(new BorderLayout());
        container.add(pan, BorderLayout.CENTER);
     
        this.setContentPane(container);
        this.setVisible(true);
      }  
     
      public static void main(String[] args) {
    	Fenetre fenetre = new Fenetre();
    }
    }

    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
     
    package pack;
    import javax.swing.JPanel;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.JPanel;
     
    public class Panneau extends JPanel {
      private int posX = 50;
      private int posY = 50;
     
      public void paintComponent(Graphics g){
     
    	  	g.setColor(Color.yellow);
     
    	    g.fillRect(0, 0, this.getWidth(), this.getHeight());
     
        g.setColor(Color.red);
        draw(g);
      }
     
      private void draw(Graphics g){      
    	      g.fillOval(posX, posY, 50, 50); 
      }        
    }

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par michelp3 Voir le message
    dans Fenetre.java, j'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     URL urlList[] = {new File("./Panneau.jar").toURI().toURL()};
     
    	   ClassLoader loader = new URLClassLoader(urlList);
     
    	   String Name = "Panneau";
    	   Object o = Class.forName(Name,true,loader).newInstance();
    Tu ne dois pas. Le Panneau doit s'utiliser exactement de la même manière, que la classe se trouve directement dans le projet ou dans un des jars du projet. Après tout, tu ne passe pas non plus par un classloader custom pour charger "javax.swing.JPanel"


    Pour résumer:

    2 projets:
    Dans le premier un fichier librairie/Panneau.java, avec une instruction "package librairie;". Tu le compile, tu en fais un jar qui doit donc contenir "/librairie/Panneau.class" et tu ajoute ce jar à ton projet via le external Librairies. On peut faire autrement avec l'interdépendance entre projets, mais vu que tu veux jouer avec un jar...

    Dans le deuxième projet, maintenant, tu peux faire un "import librairie.Panneau;" dans la class Fenetre et le compilateur va accepter ça sans message d'erreur. Tous le reste du code est identique.

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

Discussions similaires

  1. Créer un jar pour les composants JSF2
    Par simplicity4k dans le forum JSF
    Réponses: 2
    Dernier message: 08/12/2011, 22h12
  2. Réponses: 1
    Dernier message: 23/06/2002, 00h15
  3. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10
  4. Installer ses composants
    Par Geronimo dans le forum C++Builder
    Réponses: 14
    Dernier message: 18/06/2002, 14h51
  5. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

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