发生事故时删除MouseListener

时间:2013-05-03 13:24:05

标签: java swing methods override mouse-listeners

在我正在制作的游戏中,我有三种不同的mousePressed方法,一种用于单火,一种用于自动射击,一种用于近战攻击。因为自动点火使用摆动Timer,我可以在其他mousePressed方法中使用timer.stop();覆盖它。

但单一火mousePressed直接调用fire()方法,因此我无法以任何方式覆盖其他mousePressed。下面的代码显示了触发的方法(项目符号为ArrayList)。

public void fire(){
    if(!power.getChainsaw()){
        bullet.add(new Bullet(x, y));
    }
}

当玩家获得近战武器时,我需要移除MouseListener进行单次射击。我已经尝试了下面的代码,但它没有用。

removeMouseListener(new MouseAdapter(){
    public void mousePressed(MouseEvent e){
        player.mousePressed2(e);
    }   
)};

我以与此完全相同的方式添加单火和近战MouseListener。这就是实际的mousePressed方法。 public void mousePressed2(MouseEvent e){

if(SwingUtilities.isLeftMouseButton(e)){
        timer.stop();
        fire();
    }
}

public void mousePressed3(MouseEvent e){
    if(SwingUtilities.isLeftMouseButton(e)){
        timer.stop();
    }
}

mousePressed2是单一射击方法,mousePressed3是近战方法

1 个答案:

答案 0 :(得分:1)

removeMouseListener(new MouseAdapter(){
    public void mousePressed(MouseEvent e){
        player.mousePressed2(e);
    }   
)};

看看你在这做什么。您正在删除在适当位置创建的MouseAdapter实例。这意味着将创建一个新的鼠标适配器实例然后将其删除,但由于特定的侦听器实例未绑定到任何按钮,因此不会发生任何事情。

将正确的侦听器传递给removeMouseListener方法,它将起作用。

MouseAdapter myListener = new MouseAdapter() {
   public void mousePressed(MouseEvent e){
        player.mousePressed2(e);
   } 
};
someButton.addMouseListener(myListener);
// then when you want to remove it, use the same referenece.
someButton.removeMouseListener(myListener);