如果在满足某些条件之前如何禁用“确定”按钮?
这里使用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,因为初始化运行时存在按钮或不存在。 还有其他方法吗?
答案 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;
}