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 :

References sur meme objet


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut References sur meme objet
    Bonjour à tous,
    comme tout le monde sait, en java, tout est passé par référence, donc a chaque coup qu'on envoie en param. a une méthode un objet, celui - ci est copié.

    J'en viens a ma question, voici la situation:
    La notion de JPanel intervient, donc de notre ami swing, mais vu que la question est plutot basé java pur et non un problème graphique, je pense plus raisonable de l'avoir posée ici.

    Un JPanel (Tableau) sur lequel peut venir se dropper d'autres JPanel (Materiel) (qui sont en fait des images).
    La classe Tableau a dans ses attributs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static Vector<Materiel> vecteur;
    Le but etant de pouvoir travailler avec les 'Materiel' sur le Tableau, et les retrouver facilement.

    Jusque là pas de problème, maintenant voyons au niveau du drop sur le tableau comment ca se passe:

    Nous sommes dans la classe Tableau donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        /* Faire une copie de l'objet qui vient d'être droppé , drag depuis une 
         *   liste d'images
         */
        Materiel nouveau = (Materiel)droppedMateriel.clone();
        // J'ajoute l'objet a mon vecteur
        vecteur.add (nouveau);
        // Je l'ajoute ensuite au Tableau pour l'afficher sur le JPanel
        this.add (nouveau);
    OnClick sur un Materiel, un petit popup apparait et OnClick sur l'item delete de ce popup, j'appelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Le but etant de supprimer l'objet clické dans le vecteur et le Tableau
    Tableau.delElement (this);
    Cette methode statique contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static void delElement(Materiel m) {
            vecteur.remove(m);
        }
    Un Materiel contient un id unique (static int id) qui est incrémenter a chaque appel du constructeur Materiel, j'ai donc réécrit la methode equals de la classe Materiel de telle facon que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public boolean equals(Object o) {
            return (this.id == ((Materiel)o).id);
    }
    remove de vecteur va donc utilisé ma methode equals, et va bien supprimer de mon vecteur le Materiel (pour preuve, il n'est ensuite plus clickable sur le Tableau).
    Par contre, il apparait toujours sur le Tableau (JPanel).
    Dans cette methode delElement de Tableau, je ne peux pas utiliser this, et donc ne peut pas faire:
    Vous allez me dire, je n'ai qu'a ajouter une reference vers mon Tableau, bla bla bla, mais c'est bien laid, ca va surcharger mon code et de + c'est pas approprié.
    Le but est donc de pouvoir remove le Materiel du Tableau aussi, et je vois trop pas comment faire ...
    Le but final etant bien sur de pouvoir se limiter a faire :
    et donc si plusieurs references sur meme objet, cela aura comme effet de delete le Materiel du Tableau aussi ... Mais notre bon ami Java ne l'entend pas de la sorte.

    Merci de reflechir a la question car là ca pose un sacré problème ...

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Ce qui est surprenant, c'est la methode delElement soit static, alors que la methode qui ajoute le panel ne l'est pas. Ca n'est pas symetrique, ce qui, en général, est un symptome d'une conception inadéquate.
    Peux tu donner quelques precisions sur le sujet ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Citation Envoyé par Sanguko
    Ce qui est surprenant, c'est la methode delElement soit static,
    Cette méthode est en statique pour pouvoir l'apeller de ma classe Materiel sans avoir besoin d'une reference vers le tableau dans Materiel.

    Citation Envoyé par Elendil_BzH
    Pourquoi ne tout simplement pas faire de la méthode delElement, une méthode non-statique ?
    Meme remarque que ci dessus

    Citation Envoyé par ®om
    pour résumer, c'est que tu voudrais lorsque tu supprimes un objet de ton tableau, que l'objet "graphique" associé se supprime, c'est ça?
    Exactement. En deletant du vecteur, que l'objet soit deleter du JPanel aussi.



    Pour tout le monde:

    J'ai tout de même essayer en passant en non-static la methode delElement (donc reference dans chaque Materiel vers l'objet de la classe Tableau), mais ca ne change rien au probleme. Vu que ca passe par reference il ne trouve pas l'objet en question et donc ne le delete pas ...

    Me voilà un peu perdu ... alors qu'en C++ tout aurait ete comme sur des roulettes ... Faut vraiment que je me remette au java ... et surtout que je solutionne ce probleme

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Bardack
    Cette méthode est en statique pour pouvoir l'apeller de ma classe Materiel sans avoir besoin d'une reference vers le tableau dans Materiel.
    En fait, tu n'as pas trouvé comment récupérer la bonne référence, donc tu n'utilises plus d'instance mais directement une méthode statique? Ca n'est pas correct


    Exactement. En deletant du vecteur, que l'objet soit deleter du JPanel aussi.
    Pour cela, il faut que tu te crées un listener qui écoute ton modèle (ta liste -ou pour l'instant vector-), et qui prévient la vue quand il y a un changement.

    Voici un tuto pour faire cela:
    http://rom.developpez.com/java-listeners

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Mmmm ,j 'ai du mal a comprendre j'avoue ...

    Je vois pas trop que faire et dans tous les cas ca me bloque plutot pas mal ... :/

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Citation Envoyé par ®om
    En fait, tu n'as pas trouvé comment récupérer la bonne référence, donc tu n'utilises plus d'instance mais directement une méthode statique? Ca n'est pas correct
    Bah c'est pas vraiment ca.
    On Drag de ma liste d'image, Drop sur le Tableau, je fais un clone de l'image (Materiel) et ensuite je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.vecteur.add(nouveau);
    nouveau.setTableau (this);
    Meme probleme, chaque Materiel aura une reference differente sur le Tableau, ... je comprend trop pas

    et je fais ca a chaque fois.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Citation Envoyé par Bardack
    Cette méthode est en statique pour pouvoir l'apeller de ma classe Materiel sans avoir besoin d'une reference vers le tableau dans Materiel.
    Ce qui n'est pas cohérent, c'est que vecteur soit static, mais que tu puisses avoir plusieurs instances de Tableau.
    La solution proposée par Elendil_BzH (qui est sans doute la bonne), consiste à rendre toutes les methodes et attributes non statique (meme vecteur), et ajouter une methode du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       static Tableau tableau = null;
     
       static Tableau getInstance() {
           if (tableau==null)
                 tableau = new Tableau();
           return tableau;
       }
    Citation Envoyé par Bardack
    Me voilà un peu perdu ... alors qu'en C++ tout aurait ete comme sur des roulettes ... Faut vraiment que je me remette au java ... et surtout que je solutionne ce probleme
    Je pense pas que ce soit un probleme de langage, mais plutot de conception.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Par défaut
    Bonjour,

    Pourquoi ne tout simplement pas faire de la méthode delElement, une méthode non-statique ? Vu que tu l'as déclarée en statique, c'est que tu ne dois avoir qu'une seule instance de la classe Tableau à tout moment. Utiliser le design pattern Singleton devrait résoudre ton problème.

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Ton problème, pour résumer, c'est que tu voudrais lorsque tu supprimes un objet de ton tableau, que l'objet "graphique" associé se supprime, c'est ça?

    Ou alors j'ai rien compris...

    Au passage, Vector date de l'ancienne API de Collections (avant Java 1.2 !), depuis il y a de nouvelles classes, et en pratique, ce qui se fait c'est d'utiliser List<TonType> en type apparent et ArrayList<TonType> en type réel.

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

Discussions similaires

  1. If avec condition sur meme objet
    Par jazzybluesy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2012, 14h50
  2. Afficher un meme objet sur deux Jpanel différents
    Par Kehel dans le forum Débuter
    Réponses: 3
    Dernier message: 04/09/2008, 14h21
  3. Reference sur des objets
    Par sadoui dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 24/03/2008, 10h21
  4. reference sur un objet
    Par romeo9423 dans le forum C++
    Réponses: 5
    Dernier message: 16/02/2005, 21h53
  5. Requêtes : recherche de maxi sur plusieur Objet
    Par pertuis dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/03/2004, 15h28

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