Java:删除另一个类中的活动密钥侦听器



我正在制作一款小游戏,在特定事件中绘制"游戏结束",我希望玩家在发生这种情况时失去对角色的控制。我在不同的类中使用键适配器,并将其添加到构造函数中,如下所示:

addKeyListener(new GetKeyStroke(this));

我的游戏over代码是这样的(它在paint方法中):

if (gameOver) {
        g.setFont(pauseFont);
        g.setColor(Color.WHITE);
        g.drawString("Game Over!", screenSize.width / 2 - 110, screenSize.height / 5);  
    }

我试过使用

removeKeyListener(new GetKeyStroke(this));

但据我所知,这创建了一个新对象,这就是为什么它不起作用。

任何帮助都非常感谢

您需要为您添加的GetKeyStroke添加某种引用变量。

private GetKeyStroke keyListener = new GetKeyStroke(this);
...
addKeyListener(keyListener);

如果你想从另一个类访问它,你可能还想为它设置一个getter,比如

public class One {
    private GetKeyStroke keyListener;
    public One() {
        keyListener = new GetKeyStroke(this);
        addKeyListener(keyListener);
    }
    public GetKeyStroke getKeyListener(){
        return keyListener;
    }
}

然后您可以将One作为引用传递给Two,并使用getKeyListener方法获得对同一实例GetKeyStoke的引用

public class Two {
    private One one;
    private GetKeyStroke keyListener;
    public Two( final One one ) {
        this.one = one;
        keyListener = one.getKeyListener();
    }
    public someMehod() {
        one.removeKeyListener(keyListener);
    }
}

也许更合适的设计是使用interface。在这里可以看到一个例子,也许你将来会对MVC设计的更高级的主题感兴趣。


注:

  • 正如我在你的原始帖子的评论中所指出的:考虑使用Swing应用程序的键绑定。通常你会面对KeyListener的焦点问题。键绑定实际上是Oracle推荐的,而不是使用KeyListener来进行特定的键反应。

你可以创建一个对象作为keylistener

Object a = new GetKeyStroke();

,然后你可以添加和删除它。

button.addKeyListener((KeyListener) a);
button.removeKeyListener((KeyListener) a);

注意我不是专家,我知道使用Object不是很好,但我就是不知道我应该用什么

最新更新