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

时间:2014-03-23 00:59:25

标签: java swing keylistener

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

addKeyListener(new GetKeyStroke(this));

我的代码游戏看起来像这样(它在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));

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

非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

您需要为您添加的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。可以看到here的一个示例,甚至更高级的MVC Design主题可能是您未来感兴趣的。


旁注:

  • 正如我对您原始帖子的评论中所述:请考虑使用Key Bindings进行Swing应用。通常,您会遇到KeyListener的焦点问题。 Oracle实际上建议使用密钥绑定来使用KeyListener进行特定的关键反应。

答案 1 :(得分:-1)

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

Object a = new GetKeyStroke();

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

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

注意我不是专家,我知道使用Object并不好,但我无法弄清楚我应该使用什么