2010-11-21 15 views
0

Ich arbeite an einer kleinen Swing-Anwendung und benötige Hilfe. Ich habe eine Inline-Klasse für einen MouseListener und innerhalb einer der Methoden möchte ich eine Methode in der Elternklasse aufrufen, aber this ist eine Instanz des MouseListener.Java-Inline-Klassenaufrufmethode in der Elternklasse

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) 
    { 
     //... 
    } 
} 

Jede Hilfe wäre willkommen.

+1

Hinweis: der richtige Begriff ist "anonyme innere Klasse". –

Antwort

3

Auch wenn this eine Instanz des anonymen Typs ist, sollten Sie trotzdem methodX("str") aufrufen können - geben Sie ihm nicht einfach this voran.

Wenn Sie explizit sein wollen, ich glaube, es ist einige Syntax, die Sie es tun können - Sie

ParentClass.this.methodX("str"); 

schreiben kann, aber ich persönlich würde nicht die Mühe explizit zu sein, wenn Sie wirklich haben (zB um den Anruf von einer Methode in MouseListener zu unterscheiden.

1

Sie müssen nichts tun, als this aus dem Anruf zu entfernen. Wenn Sie immer noch this verwenden möchten, müssen Sie das Präfix ParentClass haben. Z.B. ParentClass.this.methodX(...) ... Aber das ist nur hässlich und sollte bei Bedarf verwendet werden (Kollisionen benennen usw.).

+1

Warum denkst du, dass es hässlich ist? – khachik

+1

@khachik: Persönlicher Geschmack? Ich benutze 'this' nicht vor irgendwelchen anderen Methodenaufrufen innerhalb einer Klasse. – dacwe

+0

Ich auch, und das ist der Grund, warum 'methodX' Bezug auf die Container-Klasse manchmal mich verwirrt. Nur persönlicher Geschmack, du hast Recht – khachik

0

Wie andere angegeben haben, einfach entfernen this. und Sie sollten in der Lage sein, Methode in der äußeren Klasse aufzurufen. In den seltenen Fällen, in denen die äußere Klasse und die verschachtelte Klasse methodeS mit dem gleichen Namen und der gleichen Parameterliste haben, rufen Sie sie mit OuterClass.this.someMehtod(...); auf.

Für saubereren Code beim Schreiben anonymer innerer Klassen rate ich Ihnen, Adapter zu verwenden. Für viele der Swings-Schnittstellen gibt es abstrakte Adapter, die sie implementieren, und Sie überschreiben nur die Methoden von Interesse. In diesem Fall wäre es MouseAdapter:

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

    void methodX(String x) 
    { 
     //... 
    } 
} 
Verwandte Themen