题
我有点不熟悉Java如何 KeyAdapter
有效,并且使用以下代码得到了意想不到的结果 KeyAdapter
. 。当一个键被按下而另一个键已经被按下时,就会出现这个问题,无论是否 isKeyPressed()
叫做。
笔记:我知道这是很多代码,对此我表示歉意。我尽了最大的努力来隔离它,我认为它主要存在于评论中 keyHandler
下面的方法(如何 keyHandler()
将当前按下的键放入 keysHeld
)。希望详尽的评论对您有所帮助。
密钥处理程序:
ArrayList keysHeld = new ArrayList<KeyEvent>();
private void keyHandler()
{
KeyAdapter keyListnr = new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
int index = 0;
boolean found = false;
while(!found && index<keysHeld.size()) //While not already found, and end of ArrayList not reached
{
System.out.print("errorCheck: keysHeld: "+keysHeld+", "+(Object)keyCode+" "); //PRINT
if(keysHeld.get(index) == (Object)keyCode)
{
System.out.println("found"); //PRINT
found = true; //This key is already recognized as held
}
else
{
System.out.println("not found"); //PRINT
//This key is not recognized as held
}
}
if(!found) //If key must be added to keysHeld
{
keysHeld.add(keyCode); //Add to list of held keys
}
System.out.println(keysHeld.toString()); //PRINT ArrayList of all held keys
} //end of keyPressed
public void keyReleased(KeyEvent e) //similar in concept to keyPressed
{
int keyCode = e.getKeyCode();
int index = 0;
boolean found = false;
while(!found && index < keysHeld.size())
{
if(keysHeld.get(index) == (Object)keyCode)
{
keysHeld.remove(index); //remove key from keysHeld
found = true;
}
else
{
index++;
}
}
System.out.println(keysHeld.toString()); //PRINT ArrayList of all held keys
} //end of keyReleased
};
addKeyListener( keyListnr );
}
是否持有钥匙:
public boolean isKeyHeld(int e)
{
int keyCode = e;
Object key = (Object)keyCode;
if(!keysHeld.isEmpty())
{
int index = 0;
while(index<keysHeld.size())
{
if(keysHeld.get(index) == key)
{
return true;
}
index++;
}
}
return false;
}
控制台输出:(按住左箭头[37],然后按右箭头[39])
[37]
errorCheck: keysHeld: [37], 39 not found
errorCheck: keysHeld: [37], 39 not found
errorCheck: keysHeld: [37], 39 not found
errorCheck: keysHeld: [37], 39 not found
...
解决方案
几点:
- 你没有填充你的
keysHeld
具有以下实例的数组KeyEvent
, ,但是使用 autoBoxedInteger
衍生自的对象int
键码。 - 你需要增加你的
index
如果你想退出变量while
循环进入keyPressed
- 你不应该使用
==
比较两者Objects
在你的while
环形
您可以使用类似以下内容进行测试:
if(keysHeld.get(index++).equals(new Integer(keyCode))
其他提示
处理多个键时,最好使用 keyReleased(KeyEvent)
方法:它可以在键释放期间更轻松地处理多个键组合。
我注意到的是,当在 keyPressed()
中时,我只能捕获一个关键字符。在 keyReleased
上,我能够捕获多个字符(例如 CTRL - V )。
不隶属于 StackOverflow