我正在尝试绑定两个不同的属性。如何将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());
}
}
如果ObjectProperty<LocalDate>
Task.date
应该代表一个日期,那么似乎更有意义。然后,您可以按照通常的方式双向绑定它们:
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());
完全根据需要工作。
请注意,由于您在注释中说您在使用XMLEncoder
封送数据时使用StringProperty
,因此完全可以在该上下文中使用此方法。请参阅本地日期序列化错误
如果你真的希望这是一个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);