我试图绑定两个不同的属性。
如何将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());
}
}
答案 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);