我通过FXML创建了Button
并关联了onAction()
方法
<Button fx:id="cancelButton" cancelButton="true" mnemonicParsing="false" onAction="#cancelButtonAction" text="Cancel" />
按钮应关闭Dialog
,但由于它是取消按钮,我不想设置结果。
我的问题是,如果我没有设置结果,对话框就不会关闭。
Dialog<String> dialog = new Dialog<>();
public void cancelButtonAction(){
System.out.println("cancel"); // this get's called
// dialog.setResult("foo"); // not working without this line
dialog.close(); // does not close the dialog
}
如何在不设置结果的情况下关闭对话框?
答案 0 :(得分:0)
这很可能是由此处列出的对话规则引起的:Dialogue
特别是这些规则:
1。 如果对话框异常关闭,并且对话框包含按钮 满足上述两个标准之一,对话框将尝试 将result属性设置为调用返回的值 结果转换器与第一个匹配的ButtonType。
2。 如果由于任何原因结果转换器返回null,或者如果是对话框 当只有一个非取消按钮出现时结果关闭 属性将为null,并且showAndWait()方法将返回 Optional.empty()。后面的这一点意味着,如果您使用其中任何一个 选项2或选项3(如本课程前面所述 文档),Optional.ifPresent(java.util.function.Consumer) lambda永远不会被调用,代码将继续执行,就好像 该对话框根本没有返回任何值。
3。 JavaFX对话框只能在“异常”(如上所述)中关闭 两种情况: 当对话框只有一个按钮时,或者当对话框有多个时 按钮,只要其中一个符合下列之一 要求: 该按钮有一个ButtonType,其ButtonData类型 ButtonData.CANCEL_CLOSE。该按钮具有ButtonType,其ButtonData 调用ButtonData.isCancelButton()时返回true。
如果您只是想快速修复问题,如果它不重要,可以试试这个:
dialog.setResult(null);
//Or this just to keep it simple
dialog.setResult("");
在帖子here中提到可以只添加一个cancel_close按钮来解决此问题:
dialog.getDialogPane().getButtonTypes().add(new ButtonType("Cancel", ButtonData.CANCEL_CLOSE));
// or as jorn said you can simple do this :
dialog.getDialogPane().getButtonTypes().add( ButtonType.CANCEL);
以下是一个完整的例子:
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.stage.Stage;
public class JavaFXApplication2 extends Application {
@Override
public void start(Stage stage) throws Exception {
Button openDialog = new Button("Open Dialog");
openDialog.setOnAction(event -> {
Dialog dialog = new Dialog();
dialog.getDialogPane().getButtonTypes().add( ButtonType.CANCEL);
dialog.setContentText("Example");
dialog.showAndWait();
});
stage.setScene(new Scene(openDialog));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}