我有一个错误,说我的条件总是错误的。基本上,在OSX上关闭应用程序的惯例是使用组合键" COMMAND + W"
我试图在我的程序中复制它。
scene.setOnKeyPressed(e -> {
if ((e.getCode() == KeyCode.COMMAND) && (e.getCode() == KeyCode.W)) {
controller.exitClick();
}
});
如果我只有第一个条件,它可以工作但当然我不希望用户只需按W就可以关闭应用程序。
控制器只是我的控制器类的一个实例,我借用了退出函数,因为我在我的应用程序上有自定义退出和最小化按钮。
这里发生了什么?
答案 0 :(得分:0)
事件setOnKeyPressed
一次检测到一个键,您无法在一个条件中检查其中两个,因为它只能应用于一个。
你可以做的是创建几个boolean
变量(每个键一个),在setOnKeyPressed
中你有条件分别检查每个键,如果按下当前键是其中之一,你设置匹配变量为true
。检查按下了哪个键后,检查两个变量,如果两个变量都是true
,则有人按下了两个键。
一个小问题是变量永远不会转到false
,如果有人没有按下键怎么办?您可以使用setOnKeyReleased
这是在释放密钥时调用的关键事件。分别检查每个密钥,如果密钥已被释放,则将条件变量设置为false
。
所以应该这样做。如果您需要示例代码,请询问。
修改强>
以下示例展示了JavaFX中多键按下的检测。
首先,我需要定义布尔变量,以保存是否按下了我的键。它们应该是类变量。
boolean keyCommand = false;
boolean keyW = false;
然后我们需要在场景中添加2个事件:
onKeyPressed事件将检测何时按下每个键。请记住,每个键都会单独调用该事件。
onKeyReleased事件将检测到我们的键不再被按下。也会分别为每个键调用此事件。
scene.setOnKeyPressed(e -> {
if(e.getCode() == KeyCode.COMMAND)
keyCommand = true;
else if(e.getCode() == KeyCode.W)
keyW = true;
if(keyCommand && keyW)
//both are pressed
doSomething();
});
现在进行第二次活动:
scene.setOnKeyReleased(e -> {
if(e.getCode() == KeyCode.COMMAND)
keyCommand = false;
else if(e.getCode() === KeyCode.W)
keyW = false;
});
就是这样。现在布尔变量可能不是保存数据的最佳方式,BooleanProperty
可能更可取,但它也应该有效。
答案 1 :(得分:0)
我通过使用整数和一种方法来解决这个问题。
我不知道这样做的潜在漏洞,但这是代码。
scene.setOnKeyPressed(e -> {
if(e.getCode() == KeyCode.SHIFT)
count++;
else if(e.getCode() == KeyCode.W)
count++;
if(count == 3)
controller.exitClick();
});
有一些全球价值int count = 1;