绑定一个空的Datepicker字段

时间:2016-06-02 09:40:00

标签: java javafx

我正在尝试将valueProperty的{​​{1}}绑定到Datepicker的{​​{1}}。 如果选择了一个日期并将其存储在textProperty“db”中,那么它将被解析,没有错误。

但是如果Label db为空,则会出错:

  

java.time.format.DateTimeParseException:无法解析文本''   在索引0

如果标签“db”为空或带有值,我希望能够在两种情况下解析日期。

这是我用来解析的更新代码。

tableviewController

Label

的viewController

Label

updatebController.java

tableview.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Employee>(){
FXMLLoader loader=new FXMLLoader(getClass().getResource("view.fxml"));
try{
   Parent newParent=loader.load();
   viewController sunController=loader.getController();
subController.textToDisplay.set(newValue.getDateOfBirth());

Stage stage =new Stage();
Scene scene =new Scene(newParent);
stage.setScene(scene);

我希望能够解析日期,即使Label db为空,上面的代码仅在Lable db有值时才有效。请帮助。

1 个答案:

答案 0 :(得分:0)

对于DatePicker和Label之间的绑定,您可以使用内置的LocalDateStringConverter

Bindings.bindBidirectional(label.textProperty(), datePicker.valueProperty(), new LocalDateStringConverter());

当DatePicker为空时,标签也将为空,并且不会抛出异常,允许继续使用

注意:在DatePicker失去焦点之前,标签不会更新为空字符串

有了这个,你不需要中间属性“textToDisplay”,而是可以替换这一行:

subController.textToDisplay.set(newValue.getDateOfBirth());

with:

datePicker.setValue(newValue.getDateOfBirth());

假设上面返回一个LocalDate

<小时/> 这是一个简单的例子:

@Override
public void start(Stage primaryStage) throws Exception{
    DatePicker datePicker = new DatePicker();
    Label label = new Label();
    Bindings.bindBidirectional(label.textProperty(), datePicker.valueProperty(), new LocalDateStringConverter());
    Button today = new Button("Set today's date");
    today.setOnAction(event-> datePicker.setValue(LocalDate.now()));
    Button clear = new Button("Clear date");
    clear.setOnAction(event-> datePicker.setValue(null));

    VBox root = new VBox(5, datePicker,
            new HBox(5, new Label("Date of Birth: "), label),
            new HBox(5, today, clear));
    root.setAlignment(Pos.CENTER);
    root.setFillWidth(false);
    Scene scene = new Scene(root, 400, 100);
    primaryStage.setScene(scene);
    primaryStage.show();
}