//TODO:ExpressionHelper 、bindBidirectional双向绑定、以及IntegerExpression的一系列算术方法和返回的IntegerBinding暂未详细解析(比如,通过 sip.divide(2) 返回的IntegerBinding对象,是如何实现当sip修改时,其get方法的值也能做到除2【随便猜测可能就类似于单向绑定一样,维护observable并记录算术操作,在get时,调用observable.get并加上算术操作】)
//注:关于观察者模式和事件监听模式(具体有没有这个定义都还待定),虽然表现不太一样但实现逻辑都一样的,观察者模式说一对多的依赖关系,当改变时其他相关依赖对象都对得到通知并更新,其实就等于调用监听器的监听方法
一、背景
使用过 SimpXXXProperty 系列的类都知道,这些类是支持属性绑定以及改变监听的,在实际开发中这种机制非常有用。
但包括Observable接口在内的这一系列类,均是由javafx所引入,在javafx包下。为了避免包引入看起来不论不类、也加深自己的理解,以SimpleIntegerProperty为例学习下实现原理。
二、使用示例
2.1 属性绑定示例
例1:javafx窗口界面中有一个圆,若想实现无论怎么拉伸,使圆均处于窗口中心位置的话,就可以使用绑定机制
circle.centerXProperty().bind(stage.widthProperty().divide(2));
例2:小demo,让一个属性始终为另一个的一半
SimpleIntegerProperty half = new SimpleIntegerProperty();
SimpleIntegerProperty target = new SimpleIntegerProperty(8);
half.bind(target .divide(2));
System.out.println(half.get());
2.2 修改监听示例
需求:比如做响应式页面,当窗口宽度小于某个阈值时,执行某些操作。
stage.widthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if(newValue < 333)
System.out.println("当前小于333&