Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaFX检测鼠标事件_Javafx - Fatal编程技术网

使用JavaFX检测鼠标事件

使用JavaFX检测鼠标事件,javafx,Javafx,我正在Kotlin下使用JavaFX开发一个屏幕音乐键盘。使用带有适当图像的按钮将图形和布局放置到位。按钮被添加到StacKPane中的组中 我可以检测简单的鼠标按下和释放事件,以触发适当的MIDI开/关消息。到目前为止,除了键盘是单音的(一次只能演奏一个音符)外,一切都很好 我希望扩展键盘以播放多个音符。手势的顺序如下: 鼠标按初始键可触发第一个音符。如果鼠标在按下按钮的情况下输入相邻的键,则在触发新注释的同时,原始注释应继续。每当松开按钮或鼠标不再位于任何键上方时,所有注释都应停止 十年前,

我正在Kotlin下使用JavaFX开发一个屏幕音乐键盘。使用带有适当图像的按钮将图形和布局放置到位。按钮被添加到StacKPane中的组中

我可以检测简单的鼠标按下和释放事件,以触发适当的MIDI开/关消息。到目前为止,除了键盘是单音的(一次只能演奏一个音符)外,一切都很好

我希望扩展键盘以播放多个音符。手势的顺序如下: 鼠标按初始键可触发第一个音符。如果鼠标在按下按钮的情况下输入相邻的键,则在触发新注释的同时,原始注释应继续。每当松开按钮或鼠标不再位于任何键上方时,所有注释都应停止

十年前,我使用Swing实现了类似的功能,但JavaFX事件的操作方式不同

我可以检测到最初的鼠标按下事件,但是只要按下按钮,移动到另一个键时就不会检测到鼠标插入的事件。我也尝试过MouseMoved、MouseDraggedEnterd和DragDetected,但没有成功。这就好像最初的鼠标按下事件正在阻止所有其他事件,直到按钮被释放。有什么建议吗?谢谢

代码片段

 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") }
    }

您是否尝试在不同的线程上运行每个便笺?请参阅的文档(特别是标题为“拖动手势”的部分)和。谢谢。拖放是一种方式。即使我没有做真正的拖放操作,鼠标的手势也会模仿。让我有点吃惊的是,Dragboard必须有一些内容才能识别DnD操作。我只是使用了一个空字符串。对于将来的问题:请提供一个演示该问题的示例。您提到您使用了拖放;我可以问一下为什么吗?据我所知,您没有在任何地方传输数据。有三种拖动姿势:1)简单的按下拖动释放,2)完全按下拖动释放,以及3)拖放。从你的问题来看,我认为选项2更适合你的需要。