JavaFX:如何覆盖自定义对话框中的按钮操作

JavaFX:如何覆盖自定义对话框中的按钮操作,java,kotlin,javafx,Java,Kotlin,Javafx,我在基于JDK 8和JavaFX的桌面应用程序上工作 我用两个按钮(finish和cancel)创建了自定义对话框类。我的目标是返回对话框中添加的字符串列表(单击“完成”按钮后,对话框返回列表。取消使返回为空列表) 我有问题,因为我单击的按钮的函数show和wait返回类型是('ButtonType.FINISH'或'ButtonType.CANCEL')。我的目标是覆盖finish和close按钮的默认操作,我希望返回列表而不是返回按钮类型 始终可以创建自定义按钮,但是,最好使用JavaFX已

我在基于JDK 8和JavaFX的桌面应用程序上工作

我用两个按钮(finish和cancel)创建了自定义对话框类。我的目标是返回对话框中添加的字符串列表(单击“完成”按钮后,对话框返回列表。取消使返回为空列表)

我有问题,因为我单击的按钮的函数show和wait返回类型是('ButtonType.FINISH'或'ButtonType.CANCEL')。我的目标是覆盖finish和close按钮的默认操作,我希望返回列表而不是返回按钮类型

始终可以创建自定义按钮,但是,最好使用JavaFX已经提供的按钮

作为响应,您可以使用任何JVM语言(Java/Kotlin/Scala)

代码:


您需要使用结果转换器

public class MyDialog extends Dialog<List<String>> {
    ArrayList<String> returnList = new ArrayList<>();
    public MyDialog() {
        returnList.add("test 1");
        returnList.add("test 2");
        this.getDialogPane().getButtonTypes().addAll(ButtonType.FINISH, ButtonType.CANCEL);

        setResultConverter(dialogButton -> {
           if (dialogButton == ButtonType.FINISH) {
               return returnList;
           }
           return new ArrayList<>();
        });
    }
}

请为了获得吸引兴趣的最佳机会,我建议简单的javafx:)@kleopatra我添加的内容还不够吗?我专注于问题的本质,我想保持简洁。我能在这段代码中添加的只是启动javafx应用程序并创建场景。也许我误解了这个问题,但如果对象类型是MyDialog而不是Dialog,为什么不添加另一个函数呢?类似于getList()的东西,它在自身上运行showAndWait,然后返回listToReturn/Null。这是一个选项。但是,我更愿意以某种方式覆盖“取消”和“完成”按钮。
val myDialog: MyDialog = MyDialog()

// here I got ButtonType ('ButtonType.FINISH' or 'ButtonType.CANCEL'), not list of string
myDialog.showAndWait().ifPresent { list -> println(list) }
public class MyDialog extends Dialog<List<String>> {
    ArrayList<String> returnList = new ArrayList<>();
    public MyDialog() {
        returnList.add("test 1");
        returnList.add("test 2");
        this.getDialogPane().getButtonTypes().addAll(ButtonType.FINISH, ButtonType.CANCEL);

        setResultConverter(dialogButton -> {
           if (dialogButton == ButtonType.FINISH) {
               return returnList;
           }
           return new ArrayList<>();
        });
    }
}
public class main extends Application {
    public static void main (String [] args) {
        launch();
    }

    @Override
    public void start(Stage primaryStage) {
        MyDialog myDialog = new MyDialog();
        myDialog.showAndWait().ifPresent(System.out::println);
    }
}