JavaFX: всплывающее уведомление после того, как действие перетаскивания вызывает остановленную иконку - PullRequest
0 голосов
/ 19 ноября 2018

Использование JavaFX 8 У меня возникла особая проблема с перетаскиванием:

При сбросе всплывающее окно с подтверждением застревает на экране, когда перетаскивается, даже наложение самого диалогового окна Alert выглядит так,:

image

Текст «копия» и значок остаются застрявшими до тех пор, пока пользователь не закроет всплывающее окно.

Это минимальный код для воспроизведения проблемы.Чтобы проверить, запустите эту программу и перетащите любой файл (например, с рабочего стола) в окно приложения:

public class Main extends Application {

private Parent root = new VBox();

private void onDragOver(DragEvent dragEvent) {
    if (dragEvent.getDragboard().hasFiles()) {
        dragEvent.acceptTransferModes(TransferMode.COPY);
    }
}

private void isUserSure() {
    Alert alert = new Alert(Alert.AlertType.WARNING,"",ButtonType.OK);
    alert.showAndWait();
}

@Override
public void start(Stage primaryStage) {
    root.setOnDragOver((event) -> onDragOver(event));
    root.setOnDragDropped((event) -> isUserSure());
    primaryStage.setTitle("ghost demo");
    primaryStage.setScene(new Scene(root, 300, 275));
    primaryStage.show();
}

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

1 Ответ

0 голосов
/ 21 ноября 2018

Я решил это сам, выполнив следующее:

Зная, что модальные диалоги (всплывающие окна с предупреждениями и т. Д.) По сути "блокируют" все остальные этапы посредством вызова showAndwait(), проблема должна заключаться в том, что это также блокируетdragEvent от завершения в методе onDragDropped (устанавливается через лямбду в setOnDragDropped).

Убедитесь, что вы обернули вызов вашего всплывающего метода и все, что должно произойти с фактическими отброшенными элементами вPlatform.runLater()

Это позволит материалу dragEvent закончить первым.Обратите внимание на изменение, которое я сделал в следующей строке метода start:

root.setOnDragDropped((event) -> Platform.runLater(() -> isUserSure()));

Убедитесь, что вы не оборачиваете больше, чем нужно, иначе элементы в Dragboard выйдут из области видимости,Извлечение необходимых предметов из Dragboard должно происходить во время выпадения, а не внутри runLater()

...