JavaFX – как узнать, была ли нажата отмена

Как я могу узнать, была ли нажата кнопка «ОК» или «Отмена» в этом диалоговом окне JavaFX.

Код диалога:

public String delimiter;

public void delimiterYES() throws IOException {
    delimiter=new String();
    TextInputDialog dialog = new TextInputDialog();
    dialog.setTitle("Delimiter");
    dialog.setHeaderText("Enter the delimiter");

    Optional<String> result = dialog.showAndWait();
    if (result.isPresent()) {
        delimiter=result.get();
    }
}

person ALSTRA    schedule 28.07.2015    source источник
comment
Javadoc не ясно об этом. Попробуйте зарегистрировать проблему: bugs.java.com   -  person Puce    schedule 28.07.2015


Ответы (3)


Если результат присутствует, то пользователь нажал OK. Если результата нет, то пользователь, вероятно, нажал кнопку отмены, но он мог просто закрыть диалоговое окно с помощью функции закрытия окна операционной системы.

Optional<String> result = new TextInputDialog().showAndWait();
if (result.isPresent()) {
    // ok was pressed.
} else {
    // cancel might have been pressed.
}

Чтобы действительно узнать, была ли нажата кнопка, вы можете использовать фильтр, как указано в Диалог javadoc раздел "Проверка диалога/перехват действий кнопки".

final Button cancel = (Button) dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
cancel.addEventFilter(ActionEvent.ACTION, event ->
    System.out.println("Cancel was definitely pressed")
);

Образец кода:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

import java.util.Optional;

public class DialogSample extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        Button showButton = new Button("show");
        showButton.setOnAction(event -> showDialog(stage));
        showButton.setPrefWidth(100);
        stage.setScene(new Scene(showButton));
        stage.show();

        showButton.fire();
    }

    private void showDialog(Stage stage) {
        TextInputDialog dialog = new TextInputDialog();
        dialog.initOwner(stage);
        dialog.setTitle("Delimiter");
        dialog.setHeaderText("Enter the delimiter");

        final Button ok = (Button) dialog.getDialogPane().lookupButton(ButtonType.OK);
        ok.addEventFilter(ActionEvent.ACTION, event ->
            System.out.println("OK was definitely pressed")
        );

        final Button cancel = (Button) dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
        cancel.addEventFilter(ActionEvent.ACTION, event ->
            System.out.println("Cancel was definitely pressed")
        );

        Optional<String> result = dialog.showAndWait();
        if (result.isPresent()) {
            System.out.println("Result present => OK was pressed");
            System.out.println("Result: " + result.get());
        } else {
            System.out.println("Result not present => Cancel might have been pressed");
        }    
    }

    public static void main(String[] args) {
        Application.launch();
    }
}
person jewelsea    schedule 28.07.2015

Вы можете использовать Optional<ButtonType> вместо Optional<String>. И в основном используйте приведенный ниже код.

 Optional<ButtonType> result = dialog.showAndWait();
    if (result.isPresent() &&  result.get()  == ButtonType.OK){
        System.out.println("Ok button is pressed");
    } else if(result.isPresent() &&  result.get()  == ButtonType.CANCEL){
        System.out.println("Cancel button was pressed");
    }

Надеюсь, поможет. Дайте мне знать, если вам нужны дополнительные разъяснения.

person Jamshed    schedule 15.09.2020

Хорошо, я нашел ответ здесь Диалоги JavaFX

Результат.isPresent() вернет false, если пользователь отменил диалоговое окно.

person ALSTRA    schedule 28.07.2015