想象一下,有一个定义鼠标模式的枚举:
public enum MouseMode { SELECTION,EDITING,DELETING }
想象一下,有一个由3个按钮组成的切换组:
ToggleButton selection = new ToggleButton("Select"); ToggleButton editing = new ToggleButton("Edit"); ToggleButton deleting = new ToggleButton("Delete"); ToggleGroup mouseSelection = new ToggleGroup();
我希望一个字段MouseMode currentMode双向链接到toggle-group.每当设置切换时,相应地切换currentMode,但是如果某个外部进程改变currentMode(可能是按键),则切换组也会相应地进行调整.
我可以用2个监听器做到这一点,但我想知道是否有办法创建自定义双向映射.
解决方法
我认为没有办法直接这样做.虽然是通用的
Bindings.bindBidirectional(Property<S> property1,Property<T> property2,Function<S,T> mapping,Function<T,S> inverseMapping)
可能是API的一个很好的补充,即使在这种情况下也没有用,因为ToggleGroup的selectedProperty是只读的(因为选择需要在调用每个Toggle的setSelected(…)方法时处理,以及ToggleGroup的selectedProperty).
在这种情况下,使用几个听众是可行的方法.
最接近“自定义双向映射”的是
Bindings.bindBiDirectional(StringProperty stringProperty,ObjectProperty<T> otherProperty,StringConverter<T> converter)
方法.在你有(可写)ObjectProperty< S>的情况下和(可写的)ObjectProperty< T>理论上,您可以使用两个双向绑定和一个中间StringProperty将它们绑定在一起.在实践中,这几乎总是比仅使用两个侦听器更多的代码,并且效率也较低.