【发布时间】:2014-05-14 20:33:54
【问题描述】:
问题:
我有一个实现KeyListener 的类来收集按键列表。然后将该列表委托给KeyListener 的实例进行处理。每次释放密钥时,都必须将其从列表中删除。
我的问题是它们没有从列表中删除,因为按下时我存储在列表中的KeyEvent 与释放键时生成的KeyEvent 不同。这会导致没有任何 KeyEvent 被删除,因此它们会累积。
我必须进行哪些更改以确保我可以删除 KeyEvent,而只知道同一密钥的不同 KeyEvent(删除方法检查 .equals())?
代码:
KeyListener subject;
ArrayList<KeyEvent> pressed = new ArrayList<KeyEvent>();
public MultiKeyListener(KeyListener subject) {
this.subject = subject;
}
@Override
public void keyPressed(KeyEvent k) {
pressed.add(k);
if (subject != null && pressed.size() > 0) {
for (int i = 0; i < pressed.size(); i++) {
subject.keyPressed(pressed.get(i));
}
}
}
@Override
public void keyReleased(KeyEvent k) {
pressed.remove(k);
if (subject != null && pressed.size() > 0) {
for (int i = 0; i < pressed.size(); i++) {
subject.keyPressed(pressed.get(i));
}
}
}
@Override
public void keyTyped(KeyEvent k) {
}
【问题讨论】:
-
您能否再解释一下为什么要将事件传递给另一个按键侦听器,以及为什么在按键被按下和释放时都发送所有按键事件?
-
@KevinSheehan 目的是让我可以解耦 KeyEvents 的处理,这样我就不需要在每次编写新类时都编写新的
MultiKeyListener。相反,我编写了一个 KeyListener 并将其传递给 MultiKeyListener。 -
抱歉,我有点困惑,为什么您不能跟踪所有被按下的键,然后只在需要的地方进行检查?您不会让不同的侦听器接收不同的键输入吗?
-
@KevinSheehan 目前,我正在使用 KeyListeners 来移动玩家,每个玩家都提供自己的 KeyListener。每次我需要新的行为/类(播放器控制、菜单等)时,编写 MultiKeyListener 似乎是违反直觉的。最简单的方法是为每个编写一个简单的 KeyListener,并将它们添加到窗口的 MultiKeyListener。
标签: java arraylist keylistener keyevent