从ArrayList中删除KeyEvents

时间:2014-05-14 20:33:54

标签: java arraylist keylistener keyevent

问题:

我有一个实现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) {

    }

3 个答案:

答案 0 :(得分:1)

您希望存储按下哪个键,而不是KeyEvent本身。每次按下,键入或释放键时都会发生新事件。您要跟踪的是KeyCodeKeyChar

编辑:只是另一个建议,您可能需要考虑使用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));