自定义JavaFX对话框

自定义JavaFX对话框,java,javafx,dialog,Java,Javafx,Dialog,我想创建一个自定义JavaFX对话框。到目前为止,我已经创造了这样的东西: public class LoginDialog extends Dialog { public LoginDialog(Data data) { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/LoginDialog.fxml")); Parent roo

我想创建一个自定义JavaFX对话框。到目前为止,我已经创造了这样的东西:

public class LoginDialog extends Dialog {

    public LoginDialog(Data data) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/LoginDialog.fxml"));
            Parent root = loader.load();
            LoginDialogController controller = loader.<LoginDialogController>getController();
            controller.setModel(new LoginModel(data));
            getDialogPane().setContent(root);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
公共类LoginDialog扩展对话框{ 公共登录日志(数据){ 试一试{ FXMLLoader=newFXMLLoader(getClass().getResource(“fxml/LoginDialog.fxml”); 父根=loader.load(); LoginDialogController控制器=loader.getController(); controller.setModel(新的LoginModel(数据)); getDialogPane().setContent(根目录); }捕获(IOE异常){ e、 printStackTrace(); } } } 但是——一开始我不相信这是正确的方法


其次,我希望在showAndWait()调用之后,使用LoginDialog.fxml文件中声明的按钮关闭这个LoginDialog。可能吗?如何设置返回值?

从控制器关闭窗口:

public class LoginDialogController {

    @FXML
    private Button button ;

    @FXML
    private void handleButtonPress() {
        button.getScene().getWindow().hide();
    }

    // ...
}
(在FXML中,您需要类似于
的内容)

要返回值,请指定对话框的类型并设置结果转换器:

public class LoginDialog extends Dialog<SomeDataType> {

    public LoginDialog(Data data) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/LoginDialog.fxml"));
            Parent root = loader.load();
            LoginDialogController controller = loader.<LoginDialogController>getController();
            controller.setModel(new LoginModel(data));
            getDialogPane().setContent(root);

            setResultConverter(buttonType -> {
                SomeDataType someData = ... ;
                return someData ;
            });

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
公共类LoginDialog扩展对话框{ 公共登录日志(数据){ 试一试{ FXMLLoader=newFXMLLoader(getClass().getResource(“fxml/LoginDialog.fxml”); 父根=loader.load(); LoginDialogController控制器=loader.getController(); controller.setModel(新的LoginModel(数据)); getDialogPane().setContent(根目录); setResultConverter(按钮类型->{ SomeDataType someData=; 返回一些数据; }); }捕获(IOE异常){ e、 printStackTrace(); } } }
显然,您可以在结果转换器中引用控制器、对其调用方法等,因此您可以根据用户在UI中的操作返回不同的值。

从控制器关闭窗口:

public class LoginDialogController {

    @FXML
    private Button button ;

    @FXML
    private void handleButtonPress() {
        button.getScene().getWindow().hide();
    }

    // ...
}
(在FXML中,您需要类似于
的内容)

要返回值,请指定对话框的类型并设置结果转换器:

public class LoginDialog extends Dialog<SomeDataType> {

    public LoginDialog(Data data) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/LoginDialog.fxml"));
            Parent root = loader.load();
            LoginDialogController controller = loader.<LoginDialogController>getController();
            controller.setModel(new LoginModel(data));
            getDialogPane().setContent(root);

            setResultConverter(buttonType -> {
                SomeDataType someData = ... ;
                return someData ;
            });

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
公共类LoginDialog扩展对话框{ 公共登录日志(数据){ 试一试{ FXMLLoader=newFXMLLoader(getClass().getResource(“fxml/LoginDialog.fxml”); 父根=loader.load(); LoginDialogController控制器=loader.getController(); controller.setModel(新的LoginModel(数据)); getDialogPane().setContent(根目录); setResultConverter(按钮类型->{ SomeDataType someData=; 返回一些数据; }); }捕获(IOE异常){ e、 printStackTrace(); } } }
显然,您可以在结果转换器中引用控制器、对其调用方法等,因此您可以根据用户在UI中的操作返回不同的值。

您可以使用以下方法创建对话框

public void popup() {
        final Stage dialog = new Stage();
        dialog.setTitle("Confirmation");
        Button yes = new Button("Yes");
        Button no = new Button("No");

        Label displayLabel = new Label("What do you want to do ?");
        displayLabel.setFont(Font.font(null, FontWeight.BOLD, 14));

        dialog.initModality(Modality.NONE);
        dialog.initOwner((Stage) tableview.getScene().getWindow());

        HBox dialogHbox = new HBox(20);
        dialogHbox.setAlignment(Pos.CENTER);

        VBox dialogVbox1 = new VBox(20);
        dialogVbox1.setAlignment(Pos.CENTER_LEFT);

        VBox dialogVbox2 = new VBox(20);
        dialogVbox2.setAlignment(Pos.CENTER_RIGHT);

        dialogHbox.getChildren().add(displayLabel);
        dialogVbox1.getChildren().add(yes);
        dialogVbox2.getChildren().add(no);

        yes.addEventHandler(MouseEvent.MOUSE_CLICKED,
                new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent e) {
                        // inside here you can use the minimize or close the previous stage//
                        dialog.close();
                    }
                });
        no.addEventHandler(MouseEvent.MOUSE_CLICKED,
                new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent e) {
                        dialog.close();
                    }
                });

        dialogHbox.getChildren().addAll(dialogVbox1, dialogVbox2);
        Scene dialogScene = new Scene(dialogHbox, 500, 40);
        dialogScene.getStylesheets().add("//style sheet of your choice");
        dialog.setScene(dialogScene);
        dialog.show();
    }
public void popup(){
最终阶段对话框=新阶段();
对话框。设置标题(“确认”);
按钮是=新按钮(“是”);
按钮编号=新按钮(“编号”);
Label displayLabel=新标签(“您想做什么?”);
displayLabel.setFont(Font.Font(null,fontwweight.BOLD,14));
dialog.initModality(Modality.NONE);
dialog.initOwner((Stage)tableview.getScene().getWindow());
HBox对话框HBox=新的HBox(20);
对话框HBox.setAlignment(位置中心);
VBox对话框VBOX1=新的VBox(20);
对话框VBOX1.设置对齐(位置居中左);
VBox对话框VBOX2=新的VBox(20);
对话框VBOX2.设置对齐(右中位置);
dialogHbox.getChildren().add(displayLabel);
dialogVbox1.getChildren().add(是);
dialogVbox2.getChildren().add(否);
是的。addEventHandler(MouseEvent.MOUSE_单击,
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
//在这里,您可以使用最小化或关闭前一阶段//
dialog.close();
}
});
no.addEventHandler(MouseEvent.MOUSE_单击,
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
dialog.close();
}
});
dialogHbox.getChildren().addAll(dialogVbox1,dialogVbox2);
场景dialogScene=新场景(dialogHbox,500,40);
dialogScene.getStylesheets().add(“//您选择的样式表”);
dialog.setScene(dialogScene);
dialog.show();
}

我更喜欢这种方法,因为我不必创建单独的控制器,而且我会得到一个弹出窗口

您可以使用以下方法创建一个对话框

public void popup() {
        final Stage dialog = new Stage();
        dialog.setTitle("Confirmation");
        Button yes = new Button("Yes");
        Button no = new Button("No");

        Label displayLabel = new Label("What do you want to do ?");
        displayLabel.setFont(Font.font(null, FontWeight.BOLD, 14));

        dialog.initModality(Modality.NONE);
        dialog.initOwner((Stage) tableview.getScene().getWindow());

        HBox dialogHbox = new HBox(20);
        dialogHbox.setAlignment(Pos.CENTER);

        VBox dialogVbox1 = new VBox(20);
        dialogVbox1.setAlignment(Pos.CENTER_LEFT);

        VBox dialogVbox2 = new VBox(20);
        dialogVbox2.setAlignment(Pos.CENTER_RIGHT);

        dialogHbox.getChildren().add(displayLabel);
        dialogVbox1.getChildren().add(yes);
        dialogVbox2.getChildren().add(no);

        yes.addEventHandler(MouseEvent.MOUSE_CLICKED,
                new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent e) {
                        // inside here you can use the minimize or close the previous stage//
                        dialog.close();
                    }
                });
        no.addEventHandler(MouseEvent.MOUSE_CLICKED,
                new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent e) {
                        dialog.close();
                    }
                });

        dialogHbox.getChildren().addAll(dialogVbox1, dialogVbox2);
        Scene dialogScene = new Scene(dialogHbox, 500, 40);
        dialogScene.getStylesheets().add("//style sheet of your choice");
        dialog.setScene(dialogScene);
        dialog.show();
    }
public void popup(){
最终阶段对话框=新阶段();
对话框。设置标题(“确认”);
按钮是=新按钮(“是”);
按钮编号=新按钮(“编号”);
Label displayLabel=新标签(“您想做什么?”);
displayLabel.setFont(Font.Font(null,fontwweight.BOLD,14));
dialog.initModality(Modality.NONE);
dialog.initOwner((Stage)tableview.getScene().getWindow());
HBox对话框HBox=新的HBox(20);
对话框HBox.setAlignment(位置中心);
VBox对话框VBOX1=新的VBox(20);
对话框VBOX1.设置对齐(位置居中左);
VBox对话框VBOX2=新的VBox(20);
对话框VBOX2.设置对齐(右中位置);
dialogHbox.getChildren().add(displayLabel);
dialogVbox1.getChildren().add(是);
dialogVbox2.getChildren().add(否);
是的。addEventHandler(MouseEvent.MOUSE_单击,
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
//在这里,您可以使用最小化或关闭前一阶段//
dialog.close()