JavaFX关闭对话框而不设置结果

时间:2016-07-03 13:17:59

标签: java javafx fxml

我通过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
}

如何在不设置结果的情况下关闭对话框?

1 个答案:

答案 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);
    }
}