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 的“对话框关闭规则”部分。
我的问题是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
.
- 但是请注意,只有当结果转换器 returns
这是一个例子:
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 的“对话框关闭规则”部分。