使用Lambda表达式无法正常工作的JavaFX中的键绑定

时间:2017-09-24 05:32:37

标签: java macos user-interface lambda

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

我试图在我的程序中复制它。

  scene.setOnKeyPressed(e -> {
        if ((e.getCode() == KeyCode.COMMAND) && (e.getCode() == KeyCode.W)) {
            controller.exitClick();
        }
    });

如果我只有第一个条件,它可以工作但当然我不希望用户只需按W就可以关闭应用程序。

控制器只是我的控制器类的一个实例,我借用了退出函数,因为我在我的应用程序上有自定义退出和最小化按钮。

这里发生了什么?

2 个答案:

答案 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;