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:
Le but etant de pouvoir travailler avec les 'Materiel' sur le Tableau, et les retrouver facilement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part private static Vector<Materiel> vecteur;
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 :
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
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);
Cette methode statique contient:
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);
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 static void delElement(Materiel m) { vecteur.remove(m); }
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).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public boolean equals(Object o) { return (this.id == ((Materiel)o).id); }
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é.
Code : Sélectionner tout - Visualiser dans une fenêtre à part this.remove(m);
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part vecteur.remove(m);
Merci de reflechir a la question car là ca pose un sacré problème ...
Partager