如何禁用DialogPane中的ButtonType.OK?

时间:2018-02-21 10:49:03

标签: javafx

如果在满足某些条件之前如何禁用“确定”按钮?

这里使用OK和CANCEL按钮实现我的DialogPane。

    Dialog<ButtonType> testDialog = new Dialog<>();
    testDialog.initOwner(mainBorderPane.getScene().getWindow());
    testDialog.setTitle("Test Dialog");
    testDialog.setHeaderText(null);
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(getClass().getResource("testDialog.fxml"));
    try{
        testDialog.getDialogPane().setContent(fxmlLoader.load());
    } catch(IOException e){
        System.out.println("Couldn't load the dialog");
        e.printStackTrace();
        return;
    }`
    testDialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
    testDialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
    Optional<ButtonType> result = testDialog.showAndWait();

然后我尝试将条件绑定到OK按钮。 条件是:TextField输入必须匹配时间格式(0-7小时,0-59分钟)

@FXML
private TextField hoursField;
@FXML
private TextField minutesField;

public void initialize(){

    testDialogPane.lookupButton(ButtonType.OK).disableProperty()
            .bind(Bindings.createBooleanBinding(
                    () -> !hoursField.getText().matches("[0-7]") ||
                            !minutesField.getText().matches("^[0-5]?[0-9]$"),
                    hoursField.textProperty(),
                    minutesField.textProperty()
            ));
}

Ofc,我收到了java.lang.NullPointerException,因为初始化运行时存在按钮或不存在。 还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

OK按钮添加到对话框后,您可以进行绑定。

您必须为控制器中的每个TextField添加一个getter,然后在您之后 加载testDialog.fxml您可以将其控制器分配给像DialogController controller = fxmlLoader.getController();这样的引用(与您的控制器交换DialogController)

然后在testDialog.getDialogPane().getButtonTypes().add(ButtonType.OK);

之后

进行绑定:

testDialogPane.lookupButton(ButtonType.OK).disableProperty()
            .bind(Bindings.createBooleanBinding(
                    () -> !controller.getHoursField.getText().matches("[0-7]") ||
                            !controller.getMinutesField.getText().matches("^[0-5]?[0-9]$"),
                    controller.getHoursField.textProperty(),
                    controller.getMinutesField.textProperty()
            ));

答案 1 :(得分:0)

在控制器类中创建一个方法,为有效/无效输入返回BooleanExpression

控制器

private BooleanExpression invalidInput;

public BooleanExpression invalidInputProperty() {
    if (invalidInput == null) {
        invalidInput = Bindings.createBooleanBinding(
                                        () -> !hoursField.getText().matches("[0-7]") ||
                                              !minutesField.getText().matches("^[0-5]?[0-9]$"),
                                        hoursField.textProperty(),
                                        minutesField.textProperty()
                                );
    }
    return invalidInput;
}

创建对话框:

fxmlLoader.setLocation(getClass().getResource("testDialog.fxml"));
testDialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
try{
    testDialog.getDialogPane().setContent(fxmlLoader.load());
    Controller controller = fxmlLoader.getController(); // depending on the name of the controller class you may need to adjust this
    testDialog.getDialogPane().lookupButton(ButtonType.OK)
                              .disableProperty()
                              .bind(controller.invalidInputProperty());
} catch(IOException e){
    System.out.println("Couldn't load the dialog");
    e.printStackTrace();
    return;
}