showAndWait 可选

Optional for showAndWait

我的问题是showAndWait 的输出何时为空?因为在我的程序中它有两个确定和取消按钮,并且取消和关闭按钮都没有给出空输出。

 dialog.showAndWait().ifPresent(buttonType -> {
        System.out.println(buttonType);
}

当我按下关闭按钮 (X) 和取消按钮时,输出为(非空):

ButtonType [text=Cancel, buttonData=CANCEL_CLOSE]

请注意 Dialog#showAndWait() return 是 Optional 并且永远不会 return null。但是,returned Optional 可能是空的。通过阅读the documentation,会出现以下情况:

  • result converter returns null.
  • 只有一个non-cancel按钮并且对话框“异常”关闭(例如X 按钮被点击)。
    • 但是请注意,只有当结果转换器 returns null(或者没有结果转换器)and[=49 时,这才会给你一个空的 Optional =] result 属性 包含 null.

这是一个例子:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class App extends Application {

  @Override
  public void start(Stage primaryStage) {
    var btn = new Button("Show dialog...");
    btn.setOnAction(
        e -> {
          Dialog<Object> dialog = new Dialog<>();
          dialog.setContentText("Empty Optional test.");
          dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
          dialog
              .showAndWait()
              .ifPresentOrElse(System.out::println, () -> System.out.println("NO RESULT"));
        });
    var scene = new Scene(new StackPane(btn), 600, 400);
    primaryStage.setScene(scene);
    primaryStage.show();
  }
}

运行 以上,显示对话框,然后单击 X 按钮将导致以下输出:

NO RESULT

换句话说,Optional 是空的。


您提到您的测试包括取消按钮。这就是为什么您会看到 non-empty Optional,因为默认情况下,当对话框“异常”关闭时,结果将是第一个匹配的取消按钮。有关详细信息,请参阅 Dialog 的 Javadoc 的“对话框关闭规则”部分。