2011-08-17 86 views
2

因此,我有一個MouseListener類,它有一個公用類中的幾個方法。 我已將mouseListener附加到公共類中的組件。如何從處理程序中調用外部方法

問題是我找不到一個簡單的方法來調用公共類中的方法,每當我說例如this.showRemove();範圍是從處理程序類而不是公共類。以下是一些示例代碼

public class Game { 

public Game() { 

    JPanel pnl = new JPanel(); 
    pnl.addMouseListener(new GameMouseListener()); 

} 

public void showRemove(){ 

    //Code Here 

} 


class GameMouseListener implements MouseListener { 

    public void mouseClicked(MouseEvent e) { 
    this.showRemove(); //Can't Find Symbol Here  

    } 

} 

} 

回答

4

當您在內部類中使用this時,您指的是內部類的實例,而不是主機類。

因爲你的內部類不是一個靜態內部類,你可以使用它訪問參考主機類的類名像這樣:

HostClass { 
    doSomething() {} 

    class Inner { 
     void blah() { 
      HostClass.this.doSomething(); 
     } 
    } 
} 

除非你調用的方法是在內部類中,可以避免顯式命名,並且可以簡單地使用方法名稱:

void blah() { 
    doSomething(); 
} 
0

您需要對Game對象的引用才能調用該方法。當你說this.showRemoved()時,「this」引用MouseListener對象而不是Game對象。

一種可能性是讓Game類擴展MouseListener,並將mouseClicked()方法放入Game類中。

+0

由於Game類的性質,它不可能擴展MouseListener。有沒有辦法將對象發送給Handler,因爲如果我要做e.getSource(),我會得到JPanel而不是Game Object。 –

1

由於showRemove是一個非靜態方法Game您需要一個該類的實例來調用該方法。

您可以改爲創建一個匿名內部類是這樣的:

pnl.addMouseListener(new MouseAdapter() { 
    public void MouseClicked (MouseEvent e) { 
    showRemove(); 
    } 
}); 

此偵聽器將與Game正在運行的實例相關聯,並因此將有機會獲得它的非靜態方法。

+0

我試圖做到這一點,我仍然無法訪問非靜態方法時,使用「this.showRemove」我仍然在一個類 –

+0

好吧我想通了,問題是,我用這個和應該按照原樣調用該方法。謝謝你的幫助! –

+0

很高興能有所幫助。這在Java中是非常常見的模式 - 通常情況下,您只需要在一個地方監聽器類。 – eaj

相關問題