拖放操作期间的JavaFX KeyEvents

时间:2018-10-03 09:09:16

标签: java javafx

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

因此,我尝试将场景的setOnKeyPressed / setOnKeyReleased与HashMap结合使用,但是这种方法存在问题:

想象一下一个场景,在按住Control的同时将TableView项拖放到某个位置。现在,如果我在下拉菜单的最后显示一个对话框,同时仍然按住Control键,则不会使用这种方法调用setOnKeyReleased ...因为Dialog是接收密钥的对话框已发布事件。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

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

public class Main extends Application {
    SimpleBooleanProperty isKeyPress = new SimpleBooleanProperty(false);
    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent window = new VBox();
        ((VBox) window).getChildren().add(new Label("example of small window:"));
        primaryStage.setTitle("example");
        Scene scene=new Scene(window);
        primaryStage.setScene(scene);
        primaryStage.show();
        scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                System.out.println("Press");
                isKeyPress.set(true);
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setTitle("Information Dialog");
                alert.setHeaderText(null);
                alert.setContentText("I have a great message for you!");
                Scene alertScene = alert.getDialogPane().getScene();
                alertScene.setOnKeyReleased(new EventHandler<KeyEvent>() {
                    @Override
                    public void handle(KeyEvent event) {
                        System.out.println("Released on dialog");
                        isKeyPress.set(false);

                    }
                });
                alert.showAndWait();
            }
        });
        scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                System.out.println("Released");
                isKeyPress.set(false);
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

输出示例:

Press
Released on dialog

答案 1 :(得分:1)

your comment开始,目标是根据 Ctrl 是否按下来更改拖放行为。在进行复制操作时,否则进行移动操作。您无需处理KeyEvent即可实现此行为。相反,您将确定是复制还是在onDragDetected处理程序中移动。 onDragDetected处理程序使用MouseEvent,它具有查询修饰键状态的方法,例如isControlDown()。使用此功能,我们可以基于修改键指定允许的传输模式。

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

请注意,使用isShortcutDown()可能会更跨平台。