2010-11-21 40 views
0

我正在研究一個小Swing應用程序,需要一些幫助。我有一個用於MouseListener的內聯類,在其中一個方法中,我想調用父類中的方法,但是,this是MouseListener的一個實例。父類中的Java內聯類調用方法

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

任何援助將不勝感激。

+1

注意:正確的術語是「匿名內部類」。 – 2010-11-21 17:08:52

回答

3

即使this是匿名類型的一個實例,您仍然應該能夠呼叫methodX("str") - 只是不要以this爲前綴。

如果你想明確,我認爲有一些語法,它可以讓你做到這一點 - 你可以寫

ParentClass.this.methodX("str"); 

但我個人不會理會是明確的,除非你真的要(例如以消除來自MouseListener中的方法的呼叫)。

1

您不需要做任何事情,只需要從呼叫中刪除this

如果您仍想使用this,則必須使用前綴ParentClass。例如。 ParentClass.this.methodX(...) ...但這只是醜陋的,應該在需要時使用(命名衝突等)。

+1

你爲什麼覺得這很醜? – khachik 2010-11-21 17:03:00

+1

@khachik:個人品味?在課程中的任何其他方法調用之前,我都不使用'this'。 – dacwe 2010-11-21 17:05:22

+0

我也是,這就是爲什麼'methodX'指向容器類有時會讓我困惑。只是個人的品味,你是對的 – khachik 2010-11-21 17:09:10

0

正如其他人所說,只需刪除this.,你應該可以在外部類中調用方法。在極少數情況下,當外部類和嵌套類具有方法名稱和參數列表時,可以使用OuterClass.this.someMehtod(...);來調用它。

對於編寫匿名內部類時的更清晰的代碼,我建議您使用適配器。對於許多Swings接口,有抽象適配器實現它們,你只能覆蓋感興趣的方法。在這種情況下,它將是MouseAdapter

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

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