Java: удалить прослушиватель активного ключа, который находится в другом классе

Я делаю небольшую игру, которая рисует «Игра окончена» на определенном событии, и я хочу, чтобы игрок потерял контроль над персонажем, когда это произойдет. Я использую ключевой адаптер в другом классе и добавляю его в конструктор, например:

addKeyListener(new GetKeyStroke(this));

Мой код завершения игры выглядит так (это в методе рисования):

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

я пытался использовать

removeKeyListener(new GetKeyStroke(this));

но из того, что я знаю, это создает новый объект, и поэтому он не работает.

Любая помощь приветствуется


person Liedrystia    schedule 23.03.2014    source источник
comment
Не по теме, но изучите использование привязки клавиш для приложений Swing. Часто вы будете сталкиваться с проблемами фокусировки с KeyListener. Привязки клавиш фактически рекомендуются Oracle вместо использования KeyListener для определенных ключевых реакций,   -  person Paul Samsotha    schedule 23.03.2014


Ответы (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. Пример можно увидеть здесь и, возможно, даже более сложную тему Проект MVC может заинтересовать вас в будущем.


Примечание:

  • Как отмечено в моем комментарии к исходному сообщению: изучите использование привязки клавиш для приложений Swing. Часто вы будете сталкиваться с проблемами фокусировки с KeyListener. Привязки клавиш фактически рекомендуются Oracle вместо использования KeyListener для определенных ключевых реакций.
person Paul Samsotha    schedule 23.03.2014
comment
Я опоздал на день и мне не хватает доллара 1+ - person Hovercraft Full Of Eels; 23.03.2014

вы можете создать объект в качестве вашего прослушивателя ключей

Object a = new GetKeyStroke();

затем вы можете добавить и удалить его.

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

Примечание Я не эксперт, я знаю, что использование Object не очень хорошо, но я просто не мог понять, что я должен был использовать

person Xaralabos Nikolaidhs    schedule 05.06.2017