我正在Kotlin下使用JavaFX开发屏幕音乐键盘。使用带有适当图像的按钮可以放置图形和布局。这些按钮将添加到StacKPane中的组中。
我可以检测到简单的鼠标按下并释放事件,以触发适当的MIDI开/关消息。到目前为止,除了键盘是单声道的(IE一次只能演奏一个音符)之外,其他所有东西都工作正常。
我希望扩展键盘以弹奏多个音符。手势顺序如下: 鼠标按下初始键会触发第一个音符。如果鼠标按下按钮时输入了相邻的键,则原始音符应在触发新音符的同时继续。每当释放按钮或鼠标不再位于任何键上方时,所有音符都应停止。
十年前,我使用Swing实现了类似的操作,但是JavaFX事件的操作方式不同。
我可以检测到最初的鼠标按下事件,但是只要按下按钮,移动到另一个键时就不会检测到MouseEntered事件。我也尝试过MouseMoved,MouseDraggedEnterd和DragDetected,但没有运气。好像初始的MousePressed事件将阻止所有其他事件,直到释放按钮为止。有什么建议么?谢谢
代码段
fun setKeyListeners(b: Button, keynumber: Int) {
b.setOnMousePressed { _ ->
node as VirtualKeyboard
val velocity = 64
node.triggerOn(keynumber, velocity)
status("key: ${node.lastKeynumber} vel: ${node.lastVelocity}")
}
b.setOnMouseReleased { _ ->
node as VirtualKeyboard
node.triggerOff(keynumber)
}
// b.setOnMouseMoved { _ -> println("Moved $keynumber") }
// b.setOnMouseDragged { _ -> println("Dragged $keynumber") }
// b.setOnMouseEntered { _ -> println("Entered $keynumber") }
}