4

私は JavaFX2.1 で宿題をしていますが、setOnKeyPressedメソッドに問題があります。私のプログラムはピアノをシミュレートするので、ボタンをクリックするたびに音が鳴ります:「Q」は「ド」、「W」は「レ」など... (今のところ) マウス入力もあります。 、一度に複数の音符を演奏できないため、後で無効にします...

私の問題:キーを押したままにすると(もちろんマウスではなくキーボードで)、関連するイベントがループでトリガーされます...いくつかのテストを行ったところ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 に答える