如何在JavaFX中将ObjectProperty <localdate>绑定到StringProperty?

时间:2018-04-06 16:34:08

标签: java javafx data-binding datepicker

我试图绑定两个不同的属性。 如何将ObjectProperty<LocalDate>绑定到StringProperty

任务类

 public class Task {

    StringProperty time = new SimpleStringProperty();
    ObjectProperty<String> testCase = new SimpleObjectProperty<>();
    StringProperty date = new SimpleStringProperty();

    public Task(String date, String time, String testCase) {
        this.date.set(date);
        this.time.set(time);
        this.testCase.set(testCase);
    }

    public String getdate() {
        return date.get();
    }

    public void setDate(String date) {
        this.date.set(date);
    }

    public StringProperty dateProperty() {
        return date;
    }
    }

控制器类

public class Controller implements Initializable {

@FXML
private DatePicker datePicker;

private Task currentTask = new Task();

@Override
public void initialize(URL location, ResourceBundle resources) {
   datePicker.valueProperty().bindBidirectional(currentTask.dateProperty());
      }
}

1 个答案:

答案 0 :(得分:1)

Task.date设为ObjectProperty<LocalDate>似乎更有意义,如果它应该代表一个日期。然后你可以用通常的方式双向绑定它们:

public class Task {

    private ObjectProperty<LocalDate> date = new SimpleObjectProperty<>();

    // ...

    public ObjectProperty<LocalDate> dateProperty() {
        return date ;
    }

    public final LocalDate getDate() {
        return dateProperty().get();
    }

    public final void setDate(LocalDate date) {
        dateProperty().set(date);
    }
}

然后当然

datePicker.valueProperty().bindBidirectional(currentTask.dateProperty());

完全符合要求。

请注意,因为在评论中您说使用StringProperty时正在使用XMLEncoder整理数据,所以完全可以在该上下文中使用此方法。见LocalDate serialization error

如果你真的希望这是一个StringProperty(我应该强调,这样做真的没有意义),你可以使用StringConverter

DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE ;

StringConverter<LocalDate> converter = new StringConverter<LocalDate>() {
    @Override
    public LocalDate fromString(String string) {
        return string == null || string.isEmpty() ? null : LocalDate.parse(string, formattter);
    }
    @Override
    public String toString(LocalDate date) {
        return date == null ? null : formatter.format(date);
    }
};

最后:

currentTask.dateProperty().bindBidirectional(datePicker.valueProperty(), converter);