当用户尝试使用 JavaFx 中的 setOnCloseRequest 关闭应用程序时的警告框

Alert Box For When User Attempts to close application using setOnCloseRequest in JavaFx

我正在尝试提示用户在退出之前确认他们要关闭程序。如果任务仍在执行,我想确认他们仍然希望退出或给他们机会让任务在退出前完成。我使用了 setOnCloseRequest,但没有用。我使用 event.consume 似乎禁用了 [x] 按钮。任何建议表示赞赏。我在这里发现了一个类似的问题,但对我不起作用 -> JavaFX stage.setOnCloseRequest without function?

Public class Sample extends Application {
      @Override
    public void start(Stage stage) throws Exception {

    stage.setOnCloseRequest(event -> {
        NewScanView checkScan = new NewScanView();
        boolean isScanning = checkScan.isScanning();

            Alert alert = new Alert(AlertType.CONFIRMATION);
            alert.setTitle("Close Confirmation");
            alert.setHeaderText("Cancel Creation");
            alert.setContentText("Are you sure you want to cancel creation?");
        if (isWorking == true){

            Optional<ButtonType> result = alert.showAndWait();
            if (result.get() == ButtonType.OK){
                stage.close();
            }

            if(result.get()==ButtonType.CANCEL){
                alert.close();
            }

        }


    });
    stage.setHeight(600);
    stage.setWidth(800);
    stage.setTitle("Title");
    stage.show();

}

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

}

尝试创建一个弹出框(如果没有),点击退出时会提示用户。如果他们 select "Ok" 然后调用 exit 方法,否则 return 无论你在做什么。

这是一个网页,其中包含有关如何编写弹出窗口的示例,因为文档完全是垃圾。 https://gist.github.com/jewelsea/1926196

此答案基于 的答案。那个问题和这个问题不一样,但是答案很相似。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.StackPane;
import javafx.stage.*;
import javafx.stage.WindowEvent;

import java.util.Optional;

public class CloseConfirm extends Application {

    private Stage mainStage;

    @Override
    public void start(Stage stage) throws Exception {
        this.mainStage = stage;
        stage.setOnCloseRequest(confirmCloseEventHandler);

        Button closeButton = new Button("Close Application");
        closeButton.setOnAction(event ->
                stage.fireEvent(
                        new WindowEvent(
                                stage,
                                WindowEvent.WINDOW_CLOSE_REQUEST
                        )
                )
        );

        StackPane layout = new StackPane(closeButton);
        layout.setPadding(new Insets(10));

        stage.setScene(new Scene(layout));
        stage.show();
    }

    private EventHandler<WindowEvent> confirmCloseEventHandler = event -> {
        Alert closeConfirmation = new Alert(
                Alert.AlertType.CONFIRMATION,
                "Are you sure you want to exit?"
        );
        Button exitButton = (Button) closeConfirmation.getDialogPane().lookupButton(
                ButtonType.OK
        );
        exitButton.setText("Exit");
        closeConfirmation.setHeaderText("Confirm Exit");
        closeConfirmation.initModality(Modality.APPLICATION_MODAL);
        closeConfirmation.initOwner(mainStage);

        // normally, you would just use the default alert positioning,
        // but for this simple sample the main stage is small,
        // so explicitly position the alert so that the main window can still be seen.
        closeConfirmation.setX(mainStage.getX());
        closeConfirmation.setY(mainStage.getY() + mainStage.getHeight());

        Optional<ButtonType> closeResponse = closeConfirmation.showAndWait();
        if (!ButtonType.OK.equals(closeResponse.get())) {
            event.consume();
        }
    };

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

}

答案确实使用了 event.consume(),您说您已经尝试过但对您没有用(尽管我不确定为什么不能使用此示例代码,因为它对我来说效果很好)。