Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.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 KeyEvents&;下降操作_Java_Javafx - Fatal编程技术网

拖放期间的JavaFX KeyEvents&;下降操作

拖放期间的JavaFX KeyEvents&;下降操作,java,javafx,Java,Javafx,我需要知道在执行拖放操作时某个键是否已按下 因此,我尝试使用带有HashMap组合的场景的setOnKeyPressed/setOnKeyReleased,但这种方法有一个问题: 设想一个场景,在按住Control键的同时将TableView项拖放到某个位置。现在,如果我在下拉列表的末尾显示一个对话框,同时仍按住Control键,则此方法永远不会调用setonkeyreased。。。因为对话框是接收密钥释放事件的对话框 如何解决此问题?希望我能理解您的问题,这里有一个可能的解决方案(使用任意键)

我需要知道在执行拖放操作时某个键是否已按下

因此,我尝试使用带有HashMap组合的场景的
setOnKeyPressed
/
setOnKeyReleased
,但这种方法有一个问题:

设想一个场景,在按住Control键的同时将TableView项拖放到某个位置。现在,如果我在下拉列表的末尾显示一个对话框,同时仍按住Control键,则此方法永远不会调用
setonkeyreased
。。。因为对话框是接收密钥释放事件的对话框


如何解决此问题?

希望我能理解您的问题,这里有一个可能的解决方案(使用任意键):

目标是根据Ctrl是否按下来更改拖放行为。如果需要,请执行复制操作,否则请执行移动操作。实现此行为不需要处理
KeyEvent
s。相反,您将决定是在
onDragDetected
处理程序中复制还是移动。
onDragDetected
处理程序使用具有查询修改器键状态的方法的。使用此选项,我们可以根据修改器关键点指定允许的传输模式

Node node = ...;
node.setOnDragDetected(event -> {
    Dragboard board;
    if (event.isControlDown()) {
        board = node.startDragAndDrop(TransferMode.COPY);
    } else {
        board = node.startDragAndDrop(TransferMode.MOVE);
    }
    // add contents to Dragboard
});

请注意,它可能更适合跨平台使用。

您是否可以添加更多关于您正在尝试做的事情的上下文(可能提供一个示例)?根据您的目标,您甚至可能不需要处理
KeyEvent
s。好吧,我只是在TableView中实现(文件)移动和复制操作。如果用户按住CTRL键将表项拖动到另一个表项,则执行复制-否则移动。我在setOnDragDrop()上显示了一个对话框,我假设它“窃取”了我在主场景中设置的密钥释放事件。我只需要在SetOnDragDrop中以某种方式查询CTRL的状态。很抱歉,看起来你误解了我的意思:/查看主要帖子上的评论以获得澄清。我认为它回答了你的问题,你需要isKeyPress var并注册到对话框上的KeyReleased事件,然后你可以检查isKeyPress的值,或者我仍然错过了什么?如果你只是需要事件的火焰,场景alertScene=alert.getDialogPane().getScene();alertScene.setOnKeyReleased(新的EventHandler(){}我会为你做mejic…你是对的,对不起!我浏览了代码,认为它做了一些不同的事情…它确实解决了确切的问题。也许不是解决这个问题的最优雅的方法,但我可以接受。谢谢!啊,所以SetOnDragDetect有一个不同于其他setOnDragXYZ方法的事件类型。我是清空以在SetOnDragDrop上执行逻辑,它的事件上没有isControlDown方法。谢谢。是的,
onDragDetected
使用
MouseeEvent
,而所有其他
onDragXXX
(不同于
onMouseDragXXX
)处理程序使用
DragEvent
DragEvent
不是
MouseEvent
的子类。
Press
Released on dialog
Node node = ...;
node.setOnDragDetected(event -> {
    Dragboard board;
    if (event.isControlDown()) {
        board = node.startDragAndDrop(TransferMode.COPY);
    } else {
        board = node.startDragAndDrop(TransferMode.MOVE);
    }
    // add contents to Dragboard
});