Диалог JavaFX: запускать onClosingRequest только при нажатии кнопки Ok - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть диалоговое окно формы, и я хочу добавить предупреждение о подтверждении до закрытия диалогового окна.

Диалоговое окно не закрывается, пока не будет подтверждено ОК.Это я могу предотвратить, используя событие.

Оно должно подтверждаться только при нажатии на кнопку «ОК», а не «Отмена».Проблема в том, что я не вижу, какая кнопка была нажата на событии.Таким образом, в диалоговом окне отображается подтверждение оповещения для кнопок «ОК» и «ОТМЕНА».

Как отключить функцию onClosingReqeust для отмены?

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.Window;

public class DialogTestApplication extends Application {

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

    class MyDialog extends Dialog<ButtonType> {

        public MyDialog(Window window) {
            setTitle("MyDialog");
            initModality(Modality.WINDOW_MODAL);
            initOwner(window);
            setResizable(true);

            GridPane contentPane = new GridPane();
            contentPane.add(new TextField(), 0, 0);
            getDialogPane().setContent(contentPane);

            getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);

            setOnCloseRequest(event -> {
                Alert alert = new Alert(AlertType.CONFIRMATION);
                alert.showAndWait().ifPresent(response -> {
                    if (response == ButtonType.CANCEL) {
                        event.consume();
                    }
                });
            });
        }
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        final StackPane root = new StackPane();
        final Label rootLabel = new Label("DialogTestApplication");
        root.getChildren().add(rootLabel);
        final Scene scene = new Scene(root, 400, 150);
        primaryStage.setScene(scene);
        primaryStage.setTitle("DialogTestApplication");
        primaryStage.show();

        Platform.setImplicitExit(true);
        MyDialog dialog = new MyDialog(primaryStage);
        dialog.showAndWait().ifPresent(response -> {
            if (response == ButtonType.OK) {
                System.out.println("OK");
            }
            Platform.exit();
        });
    }
}

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

После прочтения Dialog Javadoc я нашел решение, которое работает.https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Dialog.html

Button button = (Button) getDialogPane().lookupButton(ButtonType.OK);

button.addEventFilter(ActionEvent.ACTION, event -> {
    final Alert alert = new Alert(AlertType.CONFIRMATION);
    alert.initOwner(window);
    alert.showAndWait().ifPresent(response -> {
        if (response == ButtonType.CANCEL) {
            event.consume();
        }
    });
});
0 голосов
/ 04 декабря 2018

Вы можете обрабатывать событие действия кнопки OK вместо обработки запроса закрытия диалогового окна.Как то так

    // I tested with onMouseClicked but the event doesn't get fired
    // onAction on the other hand works normally but we need to cast the node to a button
    Button button = (Button) getDialogPane().lookupButton(ButtonType.OK);

    button.setOnAction(e -> {
            Alert alert = new Alert(AlertType.CONFIRMATION);

            alert.showAndWait().ifPresent(response -> {
                if (response == ButtonType.CANCEL) {
                    event.consume();
                }
            });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...