Я разрабатываю экранную музыкальную клавиатуру с использованием JavaFX под Kotlin. Графика и макет на месте с помощью кнопок с соответствующими изображениями. Кнопки добавляются в группу, которая находится в 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") }
}