按下单个键时,以下代码有效。
@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”发送密钥释放事件?
答案 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变量进行比较) )。
这是我检查两个键是否被按下的方法,我必须创建一个存储按下键的对象,为所需的键创建一个对象,并将它们以数组形式进行字符串化以进行比较,个人而言,这是我的首选搜索方式用于多个按键事件。
(试图通过使用热键作为示例来简化此操作,但希望对您有所帮助!)