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

AWT/Swing Java Discussion :

getParent() ne retourne pas le bon parent avec JMenuItem


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Par défaut getParent() ne retourne pas le bon parent avec JMenuItem
    Bonjour,
    Comment pourrais-je contourner ce problème là :

    http://bugs.sun.com/bugdatabase/view...bug_id=4103931

    J'ai une JFrame, une JmenuBar, des JMenu avec sous-Menu et enfin JMenuItem.

    Je suis dans mon actionPerformed et event.source est un JMenuItem. Je voudrais recuperer ma JFrame pour pouvoir atteindre un autre composant.

    Merci de lire vite fais le Bug decris ci dessus pour comprendre le probleme.

    Est ce que ma seule solution est d'etendre JMenuItem et de rajouter un attribut qui serait ma JFrame ?

    merci d'avance.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    tu peux remonter petit a petit il me semble.
    le getParent() doit te renvoyer le JMenu ou le JMenuBar d'en dessus donc fais plusieurs fois l'appel (je ne sais pas si ça marche toujours)

    sinon tu peux essayer avec getRootPane()

  3. #3
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Il y a encore plus simple : SwingUtilities.get*(). Par exemple SwingUtilities.getWindowAncestor(leJMenuItem). Tu peux ensuite caster le résultat en JFrame.

  4. #4
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Par défaut
    Merci de vos réponse mais malheureusement ca ne résoud pas mon probleme.

    En fait si vous lisez bien ça :
    This problem is caused by the fact that the
    implementation of JMenu doesn't add a JMenuItem
    to itself: It adds a JMenuItem to one of its
    private member which is a JPopupMenu. (See
    JMenu.java)
    En fait ça marche (et ça marchait déjà) avec un composant quelconque mais pas avec JMenuItem.

    Merci bien, sinon ben pour l'instant ça marche avec un attribut contenant la reference sur la JMenuBar dans chaque JMenuItem. Ca va parce qu'il n'y en a pas beaucoup.

    Le swingUtilities est interessant je vais regarder. Je peux déjà dire après un test que ça marche pas non plus pour les JMenuItem. Le composant retourné est null.

    merci

    [ EDIT ] :
    ps : c'est quoi la difference entre SwingUtilities.getWindowAncestor() et SwingUtilities.windowForComponent()

  5. #5
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Pour ton PS : la doc dit que ces deux méthodes font pareil.

    Bref, désolé j'avais oublié que c'est différent quand un popup menu se trouve dans la hiérarchie. Voici un exemple que j'utilise dans une application et dont tu peux t'inspirer :

    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
     
      public static JextFrame getJextParent(EventObject evt)
      {
        if (evt != null)
        {
          Object o = evt.getSource();
          if (o instanceof Component)
          {
            Component c = (Component) o;
            for( ; ; )
            {
              if (c instanceof JextFrame)
                return (JextFrame) c;
              else if (c == null)
                break;
              if (c instanceof JPopupMenu)
                c = ((JPopupMenu) c).getInvoker();
              else
                c = c.getParent();
            }
          }
        }
        return null;
      }
    Remplace les mentions à JextFrame par JFrame et ça devrait fonctionner. Note le cas particulier pour les popup menu avec un appel à getInvoker() au lieu de getParent().

  6. #6
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Par défaut
    Bon merci,

    En fait ça je savais faire, il y a juste le getInvoker() pour lequel j'aurai du mieux regarder dans la doc. J'ai pas pensé à regarder dans JPopupMenu.

    Sinon ben voila ce que j'ai pour recuperer ma main frame :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public JFrame getJFrame(Component e) throws ClassCastException{
            if(e instanceof JMenuItem){
                while( null != e && !(e instanceof JFrame) )
                    if(e instanceof JPopupMenu)
                        e = ((JPopupMenu)e).getInvoker();
                    else
                        e = ((JComponent)e).getParent();
            }else{
                e = SwingUtilities.getWindowAncestor(e);
            }
            return (JFrame)e;
        }
    Merci beaucoup.

Discussions similaires

  1. recherche Fulltext ne retourne pas les bons résultats
    Par gmic7 dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/12/2011, 15h06
  2. Requêt avec sum ne donne pas le bon résultat§
    Par _cece dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/11/2008, 18h53
  3. Systimestamp ne retourne pas le bon fuseau/timezone
    Par freshtasty dans le forum Administration
    Réponses: 11
    Dernier message: 07/04/2008, 15h20
  4. Mon site ne donne pas un bon résultat avec firefox
    Par beegees dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 14/08/2007, 16h46
  5. Réponses: 2
    Dernier message: 05/01/2007, 15h34

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