JavaFX中使用Lambda表达式的键绑定不起作用
我有一个错误,说我的条件总是错误的。基本上,OSX上关闭应用程序的惯例是使用组合键“COMMAND+W” 我正试图在我的程序中复制这一点JavaFX中使用Lambda表达式的键绑定不起作用,java,macos,user-interface,lambda,Java,Macos,User Interface,Lambda,我有一个错误,说我的条件总是错误的。基本上,OSX上关闭应用程序的惯例是使用组合键“COMMAND+W” 我正试图在我的程序中复制这一点 scene.setOnKeyPressed(e -> { if ((e.getCode() == KeyCode.COMMAND) && (e.getCode() == KeyCode.W)) { controller.exitClick(); } }); 如果我只有第
scene.setOnKeyPressed(e -> {
if ((e.getCode() == KeyCode.COMMAND) && (e.getCode() == KeyCode.W)) {
controller.exitClick();
}
});
如果我只有第一个条件,它就可以工作,但我当然不希望用户只需按W键即可关闭应用程序
控制器只是我的控制器类的一个实例,我从中借用了exit函数,因为我在应用程序上定制了exit和minimize按钮
这里发生了什么?事件
setOnKeyPressed
一次检测一个键,您不能在一个条件下检查其中两个键,因为它只能应用于一个键
您可以创建多个布尔变量(每个键一个),在setOnKeyPressed
中,您有条件分别检查每个键,如果当前按下的键是其中一个,则将匹配变量设置为true
。检查按下哪个键后,您将检查两个变量,如果两个变量都true
,则有人同时按下了两个键
一个小问题是变量永远不会变为false
,如果有人没有按键怎么办?您可以使用setOnKeyReleased
,这是释放密钥时调用的密钥事件。单独检查每个钥匙,如果钥匙被释放,则将条件变量设置为false
这样就可以了。如果您需要一个示例代码,请询问
编辑
下面的示例演示了在JavaFX中检测多个按键
首先,我需要定义布尔变量,无论是否按下我的键,这些变量都可以保存。它们应该是类变量
boolean keyCommand = false;
boolean keyW = false;
然后我们需要在场景中添加两个事件:
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
可能更可取,但它也应该可以工作。事件setOnKeyPressed
一次检测一个键,您不能在一个条件下检查其中两个键,因为它只能应用于一个
您可以创建多个布尔变量(每个键一个),在setOnKeyPressed
中,您有条件分别检查每个键,如果当前按下的键是其中一个,则将匹配变量设置为true
。检查按下哪个键后,您将检查两个变量,如果两个变量都true
,则有人同时按下了两个键
一个小问题是变量永远不会变为false
,如果有人没有按键怎么办?您可以使用setOnKeyReleased
,这是释放密钥时调用的密钥事件。单独检查每个钥匙,如果钥匙被释放,则将条件变量设置为false
这样就可以了。如果您需要一个示例代码,请询问
编辑
下面的示例演示了在JavaFX中检测多个按键
首先,我需要定义布尔变量,无论是否按下我的键,这些变量都可以保存。它们应该是类变量
boolean keyCommand = false;
boolean keyW = false;
然后我们需要在场景中添加两个事件:
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
可能更可取,但它也应该可以工作。我通过使用整数和一种方法解决了这个问题
我不知道这样做的潜在漏洞,但下面是代码
scene.setOnKeyPressed(e -> {
if(e.getCode() == KeyCode.SHIFT)
count++;
else if(e.getCode() == KeyCode.W)
count++;
if(count == 3)
controller.exitClick();
});
有一些全局值int count=1代码>我通过使用整数和一种方法解决了这个问题
我不知道这样做的潜在漏洞,但下面是代码
scene.setOnKeyPressed(e -> {
if(e.getCode() == KeyCode.SHIFT)
count++;
else if(e.getCode() == KeyCode.W)
count++;
if(count == 3)
controller.exitClick();
});
有一些全局值int count=1代码>可以给我一些示例代码吗?我几乎不明白你们在说什么。看,我有一个类似于我实现的想法,但我得到了一个错误,lambda表达式中使用的变量应该是final或实际上是final。所以这两个布尔变量不能使用。@compute您是否将它们定义为类变量,而不是在方法中?是的,现在它说如果(keyCommand&&keyW)
始终为false,它应该可以工作,它对我有效(刚刚测试)。这可能是两件事中的一件:你在添加时遗漏了一些东西,或者你没有专注于场景。如果在窗口上使用控件,则似乎无法识别场景关键点事件,因为它不再聚焦。可以给我一些示例代码吗?我几乎不明白你们在说什么。看,我有一个类似于我实现的想法,但我得到了一个错误,lambda表达式中使用的变量应该是final或实际上是final。所以这两个布尔变量不能使用。@compute您是否将它们定义为类变量,而不是在方法中?是的,现在它说如果(keyCommand&&keyW)
始终为false,它应该可以工作,它对我有效(刚刚测试)。这可能是两件事中的一件:你在添加时遗漏了一些东西,或者你没有专注于场景。如果在窗口上使用控件,则似乎无法识别场景关键点事件,因为它不再聚焦。