我有一个实现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) {
}
答案 0 :(得分:1)
您希望存储按下哪个键,而不是KeyEvent本身。每次按下,键入或释放键时都会发生新事件。您要跟踪的是KeyCode或KeyChar。
编辑:只是另一个建议,您可能需要考虑使用Set
而不是List
来跟踪已按下的键。实际上不能多次按下一个键。
答案 1 :(得分:1)
我说你应该从结尾到开头迭代按列表,并删除那个具有相同KeyCode的第一次出现的KeyEvent。像这样:
@Override
public void keyReleased(KeyEvent k) {
for (int i=pressed.size()-1;i>=0;i--) {
if (pressed.get(i).getKeyCode()==k.getKeyCode()) {
pressed.remove(i);
break;
}
}
......
答案 2 :(得分:1)
在KeyEvent周围使用包装器。
public class KeyEventWrapper
{
private KeyEvent keyEvent;
public KeyEventWrapper(KeyEvent keyEvent)
{
this.keyEvent = keyEvent;
}
public KeyEvent getKeyEvent()
{
return keyEvent;
}
public boolean equals(Object object)
{
if(object instanceof KeyEventWrapper)
{
KeyEventWrapper wrapper = (KeyEventWrapper) (object);
KeyEvent k = wrapper.getKeyEvent();
return (this.keyEvent.getKeyCode() == k.getKeyCode());
}
return false;
}
public int hashCode()
{
return this.keyEvent.getKeyCode();
}
}
现在,您可以使用此包装器对象的ArrayList而不是KeyEvent。
ArrayList<KeyEventWrapper> pressed = new ArrayList<KeyEventWrapper>();
...
pressed.add(new (KeyEventWrapper(k));
...
pressed.remove(new (KeyEventWrapper(k));