Javafx 当两个值都不是字符串时,如何绑定不同值的属性?

Javafx 当两个值都不是字符串时,如何绑定不同值的属性?,javafx,Javafx,我正在写一个简单的组件——一个滑块,我用它来选择一个日期,同时还有一个日期选择器,可以用来做精确的选择。我想将它们绑定在一起,以便它们始终同步其值 滑块的值是一个Double,日期选择器的值是一个LocalDate。我将滑块的值建模为“自开始日期起的年数”: LocalDate timelineStart=LocalDate.of(2016,1,1); LocalDate timelineEnd=LocalDate.of(2020,1,1); LocalDate selectedDate=Loc

我正在写一个简单的组件——一个滑块,我用它来选择一个日期,同时还有一个日期选择器,可以用来做精确的选择。我想将它们绑定在一起,以便它们始终同步其值

滑块的值是一个
Double
,日期选择器的值是一个
LocalDate
。我将滑块的值建模为“自开始日期起的年数”:

LocalDate timelineStart=LocalDate.of(2016,1,1);
LocalDate timelineEnd=LocalDate.of(2020,1,1);
LocalDate selectedDate=LocalDate.now();
双日年=365.25;
双最小值=0.0;
double maxValue=(timelineEnd.toEpochDay()-timelineStart.toEpochDay())/daysInYear;
滑块=新滑块(最小值、最大值、最大值);
DatePicker DatePicker=新的日期选择器(selectedDate);
...
现在我必须将这两个参数绑定在一起。我希望做的是:

Bindings.bindBioderial(slider.valueProperty()、datePicker.valueProperty()、(magic));
其中magic是
LocalDate
Double
之间的一个转换器,类似于(我在这一点上发明了API)


但这感觉有点像是重新发明了轮子。有更好的方法吗?

目前API中似乎没有类似的方法。但是,如果映射不是双射,您的代码可能会遇到问题:在这种情况下,您基本上是在将一个属性从侦听器更新到它(除非通过两个转换都输入一个值,结果是一个对象等于原始对象)。您可能想看看我的建议:重写以使用接口进行转换应该不难。您必须自己实现这一点(除非有第三方库提供此功能)。看看JavaFX如何实现双向绑定:。涉及
StringConverter
的实现在线
723
及以下;您可以根据这些对您的实现进行建模。您需要创建某种类型的
Converter
接口。如果您想要快速解决方案,只需让
a
侦听
B
中的更改,反之亦然。如果您想要一个优雅的方法,您必须自己编写新的API,基于API中的
BidirectionalBinding
类。如果您选择DIY,并且希望处理解除绑定用例,则需要重写
equals()
,并创建一个附加的
Binding
类,用于解除绑定(规则是,如果自定义绑定对象的两个实例位于相同的属性上,则它们相等).fabian提到的解决方案似乎正是我所需要的。考虑到实现起来有多么简单,我现在多少理解了为什么没有提供API。谢谢
new Converter<LocalDate, Double> {
 Double to(LocalDate) {
   (date.toEpochDay() - startDay) / daysInYear
 }

 LocalDate from(Double value) {
   LocalDate.ofEpochDay((long) (startDay + daysInYear * value));
 }
}