如何从处理程序中调用外部方法

问题描述:

因此,我有一个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  

    } 

} 

} 

当您在内部类中使用this时,您指的是内部类的实例,而不是主机类。

因为你的内部类不是一个静态内部类,你可以使用它访问参考主机类的类名像这样:

HostClass { 
    doSomething() {} 

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

除非你调用的方法是在内部类中,可以避免显式命名,并且可以简单地使用方法名称:

void blah() { 
    doSomething(); 
} 

您需要对Game对象的引用才能调用该方法。当你说this.showRemoved()时,“this”引用MouseListener对象而不是Game对象。

一种可能性是让Game类扩展MouseListener,并将mouseClicked()方法放入Game类中。

+0

由于Game类的性质,它不可能扩展MouseListener。有没有办法将对象发送给Handler,因为如果我要做e.getSource(),我会得到JPanel而不是Game Object。 –

由于showRemove是一个非静态方法Game您需要一个该类的实例来调用该方法。

您可以改为创建一个匿名内部类是这样的:

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

此侦听器将与Game正在运行的实例相关联,并因此将有机会获得它的非静态方法。

+0

我试图做到这一点,我仍然无法访问非静态方法时,使用“this.showRemove”我仍然在一个类 –

+0

好吧我想通了,问题是,我用这个和应该按照原样调用该方法。谢谢你的帮助! –

+0

很高兴能有所帮助。这在Java中是非常常见的模式 - 通常情况下,您只需要在一个地方监听器类。 – eaj