2010-11-21 6 views
0

Je travaille sur une petite application Swing et j'ai besoin d'aide. J'ai une classe en ligne pour un MouseListener et dans l'une des méthodes que je voudrais appeler une méthode dans la classe parente, cependant, this est une instance de MouseListener.Méthode d'appel de classe en ligne Java dans la classe parent

class ParentClass 
{ 
    void ParentMethod() 
    { 
     //... 
     swing_obj.addMouseListener(
      new MouseListener() 
      { 
       public void mouseClicked(MouseEvent e) 
       { 
        //Want to call this.methodX("str"), but 
        //this is the instance of MouseListener 
       } 
       public void mouseEntered(MouseEvent e){ } 
       public void mouseExited(MouseEvent e){ } 
       public void mousePressed(MouseEvent e){ } 
       public void mouseReleased(MouseEvent e){ } 
      } 
     ); 
     //... 
    } 
    void methodX(String x) 
    { 
     //... 
    } 
} 

Toute aide serait appréciée.

+1

Remarque: le terme approprié est "classe interne anonyme". –

Répondre

3

Même si this est une instance de type anonyme, vous devriez toujours être en mesure d'appeler methodX("str") - juste ne préfixe pas avec this.

Si vous voulez être explicite, je pense qu'il est une syntaxe qui vous permet de le faire - vous pouvez écrire

ParentClass.this.methodX("str"); 

mais avez personnellement, je ne contrarient pas être explicite, sauf si vous vraiment (par exemple pour désambiguïser l'appel d'une méthode au MouseListener).

1

Vous n'avez rien d'autre à faire que de supprimer this de l'appel. Si vous voulez toujours utiliser this, vous devez avoir le préfixe ParentClass. Par exemple. ParentClass.this.methodX(...) ... Mais c'est juste moche et devrait être utilisé en cas de besoin (nommer les collisions, etc.).

+1

pourquoi pensez-vous qu'il est moche? – khachik

+1

@khachik: Goût personnel? Je n'utilise pas 'this' avant aucun de mes autres appels de méthode dans une classe. – dacwe

+0

moi aussi, et c'est pourquoi 'methodX' se référant à la classe conteneur me confond parfois. Juste goût personnel, tu as raison – khachik

0

Comme d'autres l'ont indiqué, supprimez simplement this. et vous devriez être en mesure d'appeler la méthode dans la classe externe. Dans les rares cas où la classe externe et la classe imbriquée ont une méthode avec le même nom et la même liste de paramètres, vous l'appelez OuterClass.this.someMehtod(...);.

Pour un code plus propre lors de l'écriture de classes internes anonymes, je vous conseille d'utiliser des adaptateurs. Pour la plupart des interfaces Swings, des adaptateurs abstraits les implémentent et vous ne faites que contourner les méthodes qui vous intéressent. Dans ce cas, il s'agirait de MouseAdapter:

class ParentClass 
{ 
    void ParentMethod() 
    { 
     swing_obj.addMouseListener(new MouseAdapter() 
     { 
      @Override 
      public void mouseClicked(MouseEvent e) 
      { 
       someMethodX(); 
      } 
     }); 
    } 

    void methodX(String x) 
    { 
     //... 
    } 
} 
Questions connexes