JavaFX KeyEvents во время операции перетаскивания - PullRequest
0 голосов
/ 03 октября 2018

Мне нужно знать, нажата ли определенная клавиша при выполнении операции перетаскивания.

Поэтому я попытался использовать setOnKeyPressed / setOnKeyReleased сцены с комбинацией HashMap, но яВозникла проблема с этим подходом:

Представьте себе сценарий, когда один перетаскивает элемент TableView куда-то, удерживая Control.Теперь, если я отображаю диалоговое окно в конце отбрасывания , все еще удерживая нажатой клавишу Control, при таком подходе никогда не вызывается setOnKeyReleased, поскольку диалог - это тот, который получает событие отпускания ключа.

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Из вашего комментария цель состоит в том, чтобы изменить поведение перетаскивания в зависимости от того, выключен Ctrl или нет.Когда это сделать операцию копирования, в противном случае сделайте операцию перемещения.Вам не нужно иметь дело с KeyEvent s, чтобы реализовать это поведение.Вместо этого вы определяете, копировать или перемещать в обработчике 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().

0 голосов
/ 03 октября 2018

Надеюсь, я понимаю, что ваш вопрос здесь является возможным решением (работа с любой клавишей):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...