Изменение курсора в алертбоксе JavaFX

Привет, я пытаюсь изменить курсор в предупреждении JavaFX, которое отображается после нажатия кнопки в sceneHome после нажатия кнопки.

Это функция, которая вызывается, когда пользователь нажимает кнопку в sceneHome:

public void export() {
    Alert alert = new Alert(AlertType.CONFIRMATION);
    alert.setTitle("Export menu");
    alert.setHeaderText("Wat wilt u exporteren, adressen of ritten?");
    alert.setContentText("Maak een keuze.");
    ButtonType buttonTypeOne = new ButtonType("Adressen");
    ButtonType buttonTypeTwo = new ButtonType("Ritten");
    ButtonType buttonTypeCancel = new ButtonType("Annuleren", ButtonData.CANCEL_CLOSE);

    alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeCancel);

    Optional<ButtonType> result = alert.showAndWait();
    if (result.get() == buttonTypeOne){
        //scene.setCursor(Cursor.WAIT);
        ToCSV.export("adressen");
        //scene.setCursor(Cursor.DEFAULT);
    } else if (result.get() == buttonTypeTwo) {
        //scene.setCursor(Cursor.WAIT);                
        ToCSV.export("ritten");
        //scene.setCursor(Cursor.DEFAULT);
    } else{
        //do nothing
    }
}

Если я скажу sceneHome.setCursor(Cursor.WAIT), ничего не произойдет, а если я скажу alert.getDialogPane().getScene().setCursor(Cursor.WAIT), то получу NullPointerException...

Итак, в какую сцену мне следует пройти (в //scene.setCursor(Cursor.DEFAULT); и //scene.setCursor(Cursor.WAIT);)?


person lmiv    schedule 04.03.2018    source источник
comment
ничего не происходит тогда   -  person lmiv    schedule 04.03.2018


Ответы (1)


Похоже, ваш вызов ToCSV.export фактически блокирует программу для изменения курсора. Попробуйте запустить выполнение этого метода в отдельной задаче. :

private static void export(Scene scene) {
    Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
    alert.setTitle("Export menu");
    alert.setHeaderText("Wat wilt u exporteren, adressen of ritten?");
    alert.setContentText("Maak een keuze.");
    ButtonType buttonTypeOne = new ButtonType("Adressen");
    ButtonType buttonTypeTwo = new ButtonType("Ritten");
    ButtonType buttonTypeCancel = new ButtonType("Annuleren", ButtonBar.ButtonData.CANCEL_CLOSE);
    alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeCancel);
    Optional<ButtonType> result = alert.showAndWait();
    if (result.get() == buttonTypeOne){
        scene.setCursor(Cursor.WAIT);
        final Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                ToCSV.export("adressen");
                return null;
            }
            @Override
            protected void succeeded() {
                scene.setCursor(Cursor.DEFAULT);
            }
        };
        new Thread(task).start();
    } else if (result.get() == buttonTypeTwo) {
        //
    } else{
        //do nothing
    }
}

scene — это место, где находится кнопка, открывающая этот диалог.

В идеале, ради чистого кода, вы должны создать отдельный ToCSVTask класс с этой логикой и отправить его на ExecutorService — вы можете найти в Google самый простой способ, как это сделать.

person Enigo    schedule 04.03.2018
comment
Спасибо за ответ, братан, это сработало. Попробую создать новый класс. - person lmiv; 05.03.2018
comment
Да, круто) проверьте этот ответ, похоже, это именно то, что вам нужно. - person Enigo; 05.03.2018