MDI : Lien entre JInternalFrame et menu documents

MDI : Lien entre JInternalFrame et menu documents - Java - Programmation

Marsh Posté le 24-11-2004 à 18:24:21    

Bonjour
J'ai un petit probleme avec une application que je dois développer en java.
En fait cette application doit gérer le MDI.
Ce que je n'arrive pas à faire c'est un lien entre les différentes fenetre de l'appli (JInternalFrame) et le menu que j'ai créé et qui liste toutes les fenetres ouvertes un peu comme le menu documents ou fenetres de word).
J'ai besoin de ce lien pour pouvoir tenir à jour la liste des fenetres ouvertes.

Reply

Marsh Posté le 24-11-2004 à 18:24:21   

Reply

Marsh Posté le 24-11-2004 à 23:30:41    

tu fou une référence de chaque internalFrame dans une hashmap  

Reply

Marsh Posté le 24-11-2004 à 23:32:02    

merci pour ta réponse :-)
une reference ? c possible ça ?
et une hashmap m'en suis jamais servi... ça consiste en quoi ?
dsl je débute

Reply

Marsh Posté le 24-11-2004 à 23:32:26    

impeccable, ca répond à  une question que j'allais poser...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-11-2004 à 23:36:50    

mais utiliser une table de hash, ca t'oblige à recreer ta fenetre, la hasher, et voir si t'a déjà une fenetre de ce type dans la table non ?
 
Edit : g rien dit : un iterator suffira :p ...
 
celà dit je vois tjs pas l'intéret de la table de hash sur une bete collection genre ArrayList, ou même mieux un Set (qui empeche les doublons)...
 
tu fous tes fenetres dans la collection, et tu l'itères en testant un attribut donné (comme le titre de la fenetre dont on peut supposer qu'il est unique) pour voir si elle est pas ouverte...


Message édité par Jubijub le 24-11-2004 à 23:51:01

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 00:05:39    

s'il ve recuperer sa frame en une instruction ?
 
 
avec ton arrayList,t'auras forcement une boucle ce sera plus long.
 
blueman_82>> une hashMap en gros c'est une clé => un objet
 
la en l'occurence:
uneCléUniqueCorrespondantAUneFrame=>InstanceDeTonInternalFrame

Reply

Marsh Posté le 25-11-2004 à 00:08:15    

oui mais il l'a récupère comment la clé ?
 
il crée une fenetre, la hash, la fout dans la map selon ce hash...
 
ensuite il la sort comment ? faut connaitre le hash, et il le retrouve où ? je croyais qu'on se servait des hashmap parce que par ex en hashant quelques attributs, on avait un hash avec une dispersion correcte, et que du coup, on pouvait facilement refabriquer le hash pour récupérer ce qu'on avait mis dans la table...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 00:15:59    

Jubijub a écrit :

oui mais il l'a récupère comment la clé ?
 
il crée une fenetre, la hash, la fout dans la map selon ce hash...
 
ensuite il la sort comment ? faut connaitre le hash, et il le retrouve où ? je croyais qu'on se servait des hashmap parce que par ex en hashant quelques attributs, on avait un hash avec une dispersion correcte, et que du coup, on pouvait facilement refabriquer le hash pour récupérer ce qu'on avait mis dans la table...

euh, tu confondrais pas un peu deux notions là?
 
j'imagine que l'idée de very (j'ai pas lu tout le topic) c'est d'assigner un "nom" à une frame... tu as besoin du hash pour récuperer un objet dans une hashmap, mais juste de la clé, qui peut etre completement arbitraire par rapport à l'objet que tu lui associs. D'ailleurs faudrait parler d'une Map et nom d'une HashMap.. le coup du hash c'est une bidouille internet à l'implementation HashMap de Map (qu'il est, certes, interessant de connaitre si on veut bien utiliser HashMap et/ou bien choisir son implementation de Map en fonction de l'utilisation qu'on en aura)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 00:20:36    

c possible...
 
je croyais que ct le hash moi la clé...
 
en gros : mettons que l'objet toto aie 2 attributs : un int et le nom ...on surcharge hash pour dire que c par ex le hash du int + le hash du nom, et ca donne un bo hash qui sert de clé pour retrouver toto dans la table...
 
et du coup, sachant les valeurs des attributs int et nom, on peut refaire le hash, et récupérer toto...c pas comme ca que ca s'utilise une hashmap ? (y'a un topic de benou je crois là dessus, et c ca qu'il dit si j'ai bien suivi)...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 00:22:44    

je comprend rien :-(
moi ce que je veux faire, c'est en quelque sorte lier un JmenuItem à une JInternalFrame. dans le but de quand je ferme une JInteralFrame ben ça supprime le JmenuItem correpondant
c'est reloux de pas etre bon en java lool

Reply

Marsh Posté le 25-11-2004 à 00:22:44   

Reply

Marsh Posté le 25-11-2004 à 00:29:06    

soit t'as mal suivi, soit il a mal expliqué, soit c'est moi qui te comprend pas [:joce]

Code :
  1. public class Toto {
  2. private int i;
  3. private String name;
  4. public Toto(int i) {
  5.    this.i = i;
  6. }
  7. public int hashcode() {
  8.    return 3 + i;
  9. }
  10. }


bon, ensuite

Code :
  1. Toto a = new Toto(1);
  2. Toto b = new Toto(2);
  3. Toto c = new Toto(3);
  4. Toto d = new Toto(4);
  5. Map m = new HashMap();
  6. m.put("proute", a);
  7. m.put(b, "tralala" );
  8. m.put(c, d);


 
là, qu'est-ce qui se passe?
en (6), la map utilise la methode hashcode de String pour aller mettre "a" dans le seau qui va bien.
Pour recuperer "a", je ferai m.get("proute" ), et HashMap appelera de nouveau l'hashcode de String pour trouver le seau qui va bien, et ensuite me renverra "a" si ce qu'il trouve dans le seau est equals(), sinon il continue (bon, je reste volontairement flou sur l'histoire des seaux, faudrait relire, mais bref)
 
bref, idem pour les 2 autres cas, sauf que là ça sera forcement la methode hashcode de Toto qui sera utilisée, mais moi derriere pour recuperer le String "tralala" ou "d", je ferais m.get(b) ou m.get(c)
 
en clair, la methode hashcode, c'est pas un truc que tu utilises dans du code "business", c'est de la popote interne pour des trucs plus bas niveau... genre HashMap, donc.
 
 
 [:krapo]  
 
(toute information contenue dans ce post est donnée sous reserve d'erreur non-contractuelle ... enfin un truc dans le genre)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 00:31:08    

-->blueman_82
 
heu, si j'ai suivi, tu veux qu'à n'importe quel instant t, t au max qu'une seule fenetre d'un type donné d'ouverte, c bien ca ? cad si t'a 3 fenetres titi toto tata, tu veux pas qu'on puisse ouvrir 2 titi en meme temps ?
 
ce sur quoi on discute, c le fait de ranger des références aux fenetres ouvertes dans une Collection, et l'idée c de vérifier si on a une référence à la fenetre avant de l'ouvrir : si oui, on va chercher la fenetre, sinon, on la crée, et range la référence dans le tableau...tout en pensant, avec des FrameEvent, à sortir la fenetre du tableau de ref qd elle est fermée


Message édité par Jubijub le 25-11-2004 à 00:36:53

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 00:36:32    

the real moins moins a écrit :


des choses intéressantes


 
ce que tu veux me dire c qu'on peut mettre totalement n'importe quoi comme clé, la hashmap la hash, et rentre la valeur dans le bucket qui correspond à la clé...
 
question : que se passe-t-il si on rentre 2 trucs avec la meme clé ? (benou par le de sac de billes, ce qui implique que plusieurs choses peuvent se trouver dans la meme clé...ou alors qu'il stocke une collection comme objet correspondant à la clé)...
 
donc pour l'exemple courant, on dit que par ex on fait un getTitle() sur chaque frame, on peut ranger la frame selon sa clé "title", et donc pour récupérer la fenetre "toto", on va faire un get("toto" )... c ca ?


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 00:37:54    

http://bluezone.free.fr/screen.JPG
 
alors voila à quoi ressemble mon interface.
j'ai la possibilité via le mnu fichier d'ouvrir autant de fenetre que je veux.
à l'ouverture d'une fenetre, le menu Documents est aussi tot complété par un sous menu qui permet d'afficher la fenetre en question.
la difficulté du truc c'est de supprimer ses sous menu lorsque la fenetre "cible" a été fermée par l'utilisateur.

Reply

Marsh Posté le 25-11-2004 à 00:42:21    

ahhhhhhhhhhhhh, tu veux faire comme le menu "Fenetres" en gros...
 
ben là c facile : tu colles un windowListener à tes internalFrame, et tu captures :  
 public void windowClosed(WindowEvent e) {
 
    }
 
cette méthode s'exécutera à la fermeture des fenetres...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 00:43:00    

Jubijub a écrit :

ce que tu veux me dire c qu'on peut mettre totalement n'importe quoi comme clé, la hashmap la hash, et rentre la valeur dans le bucket qui correspond à la clé...
 
question : que se passe-t-il si on rentre 2 trucs avec la meme clé ? (benou par le de sac de billes, ce qui implique que plusieurs choses peuvent se trouver dans la meme clé...ou alors qu'il stocke une collection comme objet correspondant à la clé)...
 
donc pour l'exemple courant, on dit que par ex on fait un getTitle() sur chaque frame, on peut ranger la frame selon sa clé "title", et donc pour récupérer la fenetre "toto", on va faire un get("toto" )... c ca ?

à voir comment c'est implementé pour savoir comment il fait, mais le contrat dit que de toutes façons il vérifie avec un equals() avant de te renvoyer l'objet:

Citation :

More formally, if this map contains a mapping from a key k to a value v such that (key==null ? k==null : key.equals(k)), then this method returns v; otherwise it returns null. (There can be at most one such mapping.)


 
quand tu entres plusieurs object avec la même clé, seul les dernier reste.
quand tu entres plusieurs objets avec une clé differente, mais que ces clés ont un hashcode identique, tous ces objet restent dans la map, c'est juste anti-performant.
 
et donc pour l'exemple courant, oui.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 00:47:16    

Jubijub a écrit :

ahhhhhhhhhhhhh, tu veux faire comme le menu "Fenetres" en gros...
 
ben là c facile : tu colles un windowListener à tes internalFrame, et tu captures :  
 public void windowClosed(WindowEvent e) {
 
    }
 
cette méthode s'exécutera à la fermeture des fenetres...


 
oui biensur j'ai fait ça :-)
et j'arrive à fermer la fenetre sans soucis et récupérer l'event
mais le truc ce que je recupere pas l'objet jmenuitem pour pouvoir le supprimer à son tour

Reply

Marsh Posté le 25-11-2004 à 00:55:09    

faut le foutre dans une collection quelconque, et tu le vire ensuite...par contre je sais pas si les menus ont un event pour forcer leur rafraichissement


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 00:57:02    

nan ils ont pas d'event mais une methode pour supprimer un item quand tu passes l'objet en parametre

Reply

Marsh Posté le 25-11-2004 à 00:59:45    

et ben tu utilises la hashmap comme l'a montré moinsmoins : en clé tu met le nom de la fenetre, et en objet le menuItem ...
 
du coup qd tu fermes une fenetre, tu récupères son titre, ca te donne le menuItem, et t'a plus qu'à le supprimer et à demander un refresh du menu (si c pas automatique après une suppression)


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 01:00:42    

(sur l'event du menu tu recuperes le menuitem? :heink: )


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 01:01:29    

(et sinon bah ce qu'a suggéré veryfree en premier, c'est de mapper la fenetre sur le menuitem, pas besoin d'une indirection sur le nom)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 01:02:30    

heu non pas du tout : je me demandais si qd on altérai un menu y'avait un event pour dire au menu qu'il avait changé (par ex qd t'altères une Table, le tablemodel a un event pour dire que les données ont pu changer, et qu'il faut faire un refresh)


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 01:03:46    

the real moins moins a écrit :

(et sinon bah ce qu'a suggéré veryfree en premier, c'est de mapper la fenetre sur le menuitem, pas besoin d'une indirection sur le nom)


 
cad concrètement ?
 
si g suivi son affaire, il veut que si on vire la fenetre, le menuitem saute aussi...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 01:05:57    

Jubijub a écrit :

heu non pas du tout : je me demandais si qd on altérai un menu y'avait un event pour dire au menu qu'il avait changé (par ex qd t'altères une Table, le tablemodel a un event pour dire que les données ont pu changer, et qu'il faut faire un refresh)

ha, visuellement.
euh je sais pas mais je crois que c'est "automatique" :??:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 01:06:41    

Jubijub a écrit :

cad concrètement ?
 
si g suivi son affaire, il veut que si on vire la fenetre, le menuitem saute aussi...

map.put(frame, menuitem);
 
JMenuItem menuItemToRemove = map.get(frame);
menu.remove(menuItemToRemove);
 
 
[:spamafote]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 01:16:59    

lol je l'avais proposé en inversant...mais gt pas loin ...oui c pas con du tout en y réfléchissant :)


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 01:19:40    

y'a des implementations de map bi directionnelles je crois, sinon.
(si on veut pas se faire chier, on agrege deux map et hop)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 01:20:34    

cad agéger ?


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2004 à 01:24:06    

Code :
  1. class MaSuperMapQuiPrendDesDeuxCotes(
  2. Map normal;
  3. Map reverse;
  4. public void put(Object k, Object v) {
  5.   normal.put(k,v);
  6.   reverse.put(v,k);
  7. }
  8. public Object get(Object k) {
  9.   Object result = normal.get(k);
  10.   if (result == null) {
  11.     result = reverse.get(k);
  12.   }
  13.   return result;
  14. }


 
un truc dans la genre
 


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-11-2004 à 01:27:36    

c bien ce que je pensais...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed