当按下两个键时,为什么没有发送键释放事件?

时间:2011-09-10 10:40:08

标签: swt

按下单个键时,以下代码有效。

@Override public void handleEvent(Event evt) {
    switch(evt.type) {
    case SWT.KeyDown:
        System.out.println(evt.keyCode + " pressed");
        break;

    case SWT.KeyUp:
        System.out.println(evt.keyCode + " released");
        break;
    }
}

...

widget.addListener(SWT.KeyDown, this);
widget.addListener(SWT.KeyUp, this);

但是当你按下“A”之类的多个键然后按“B”时,听众只会收到“B”的键上事件而没有“A”的事件。因此,......

switch(evt.type) {
case SWT.KeyDown:
    mKeyMap.get(evt.keyCode).isDown = true;
    break;

case SWT.KeyUp:
    mKeyMap.get(evt.keyCode).isDown = false;
    break;
}

键“A”将始终保持为真,直到您再次按下它并接收按键事件和按键事件。但是,使用箭头键不会发生此问题。您可以按多个箭头键,并正确发送密钥启动事件。

那么,当按下“A”和“B”键时,为什么没有为键“A”发送密钥释放事件?

3 个答案:

答案 0 :(得分:1)

环顾四周(因为我对游戏代码的问题有同样的问题)我发现了这个Eclipse的错误:

Bug 50020 - KeyReleased not working correctly.

似乎问题已存在了大约8年,并且不太可能很快得到解决/打补丁。 :(

答案 1 :(得分:0)

这可能会受到键盘的影响。我不确定这是否可能导致您的问题,但请看一下这个链接:

http://www.tomshardware.com/forum/50383-28-pressing-multiple-keys-keyboard-problem

答案 2 :(得分:-1)

function isUserPressingCopy(){
    var copy = ["Meta", "c"]
    var map = {};
    let buttonPressed = []
    onkeydown = onkeyup = function(event){
    event;
    map[event.key] = event.type == 'keydown';
    buttonPressed.push(map[event.key])
    if (Object.values(map).every(item => item === true)){
      if(JSON.stringify(Object.keys(map)) == JSON.stringify(copy))
      console.log("you pressed copy")
    }
    else{
      map = {}
    }
  }
}

当您在控制台中声明此功能并执行该功能时,您应该能够在Mac上执行“ cmd” +“ c”,并且控制台将告诉您是否按下了copy(将其与我设置的copy变量进行比较) )。

这是我检查两个键是否被按下的方法,我必须创建一个存储按下键的对象,为所需的键创建一个对象,并将它们以数组形式进行字符串化以进行比较,个人而言,这是我的首选搜索方式用于多个按键事件。

(试图通过使用热键作为示例来简化此操作,但希望对您有所帮助!)