JavaFX中使用Lambda表达式的键绑定不起作用

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(); } }); 如果我只有第

我有一个错误,说我的条件总是错误的。基本上,OSX上关闭应用程序的惯例是使用组合键“COMMAND+W”

我正试图在我的程序中复制这一点

  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,它应该可以工作,它对我有效(刚刚测试)。这可能是两件事中的一件:你在添加时遗漏了一些东西,或者你没有专注于场景。如果在窗口上使用控件,则似乎无法识别场景关键点事件,因为它不再聚焦。