4

我正在用 JavaFX2.1 做作业,但我的setOnKeyPressed方法有问题。我的程序模拟钢琴,所以每次单击按钮时它都会发出声音:“Q”是“do”,“W”是“re”等等......我还有(现在)鼠标输入,稍后将被禁用,因为我不能同时弹奏多个音符...

我的问题:如果我按住一个键(当然是在键盘上,而不是用鼠标),它的关联事件将在循环中触发......我做了几个测试,注意到只有setOnKeyPressed触发,而不是 setOnKeyReleased。

我做了一些解决方法,但他们没有做我期望的事情:

  • 添加一个布尔值以了解该键是否已被释放,从而禁用一次按下多个键的可能性。
  • 播放完声音后关闭音量(并在释放键时将其恢复到其值)似乎也适用于多个键,但与按住鼠标时相比,声音的持续时间要短得多在同一把钥匙上。

有什么建议么?

4

1 回答 1

3

您不能禁用多个事件,因为它是系统行为。对您来说最好的解决方案是改进布尔标志方法来存储每个键的标志。例如下一个方式:

    final Set<String> pressedKeys = new HashSet<String>();

    keyboard.setOnKeyPressed(new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent t) {
            String note = t.getText();
            if (!pressedKeys.contains(note)) {
                // you may need to introduce synchronization here
                pressedKeys.add(note);

                playNote(note);
            }
        }
    });
    keyboard.setOnKeyReleased(new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent t) {
            pressedKeys.remove(t.getText());
        }
    });
于 2012-06-21T11:14:20.977 回答