禁用setOnKeyPressed的自动重复(JavaFX 2.1)

时间:2012-06-20 18:02:01

标签: java javafx-2 autorepeat

我正在JavaFX2.1中做作业,我遇到了setOnKeyPressed方法的问题。 我的程序模拟钢琴,所以每次点击按钮都会发出声音:'Q'是'do','W'是're'等等......我也有(现在)鼠标输入,因为我不能一次玩几个音符而被禁用...

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

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分: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());
        }
    });