1、什么是属性
属性是类的可公开访问的特征,影响类的行为、状态或者两者。属性是可以公开访问的,但是它的使用调用了隐藏实际实现的
方法来访问数据。
属性是可以观察的,当值发生变化时,相关方会得到通知。
2、属性的种类
1、简单的属性
2、索引属性 使用数组数据类型实现
3、绑定属性 在更改时向所有侦听器发送通知。
4、约束属性 侦听器可以否决更改的属性
3、什么是绑定
数据绑定定义了程序中数据元素(通常是变量)之间的关系,以保持它们的同步,在GUI中,经常用于将数据模型中的元素与相应
的UI元素同步。
要使绑定正常工作,必须在绑定的依赖项发生更改时通知绑定。支持绑定的编程语言提供了一种向依赖项注册侦听器的机制。当依
赖项失效或发生更改时,将通知所有侦听器。当绑定收到这样的通知时,它可以与其依赖项同步。
绑定包括双向绑定和单项绑定,双向绑定中依赖的对象和被绑定的对象的值彼此同步。通常双向绑定定义在两个变量之间。
单向绑定只在一方进行传递。
4、绑定支持
要被监听的属性首先需要在类里声明监听支持对象,PropertyChangeSupport
然后定义 注册更改通知方法(addPropertyChangeListener() )和注销更改通知方法(removePropertyChangeListener),以供感兴趣的监听器使用。
使用firePropertyChange()方法将更改通知给已注册的监听器
监听器首先需要向被监听对象注册,及调用被监听属性对象的addPropertyChangeListener() 方法
并在收到更改通知时采取必要的操作,handlePropertyChange(propertyChangeEvent e)
5、JavaFX中的属性
属性可以表示一个值或一个值的集合。
属性是对象。每种类型的属性都有一个属性类层次结构。例如,IntegerProperty、DoubleProperty和StringProperty类分别
表示int、double和String类型的属性。这些类是抽象的。它们有两种类型的实现类:一种表示读/写属性,
另一种表示只读属性的包装器。例如,SimpleDoubleProperty和ReadOnlyDoubleWrapper类是具体的类,
它们的对象分别用作读/写和只读双属性。
属性类提供了两对getter和setter方法:get()/set()和getValue()/setValue()。get()和set()方法分别获取和设置属性的值。
对于基本类型属性例如IntegerProperty, get()方法的返回类型和set()方法的参数类型都是int。getValue()和setValue()方法使用对象类型;
例如,它们的返回类型和参数类型是IntegerProperty的Integer。
对于引用类型属性,如StringProperty和ObjectProperty<T>, getter和setter对都使用对象类型。也就是说,StringProperty的get()和
getValue()方法都返回一个String, set()和setValue()方法接受一个String参数。
所有的JavaFX属性都是可以观察的。
6、理解属性类层次结构
只要Property和ObservableValue通过继承相关联,就可以在它们之间创建单向绑定。双向绑定只能在相同类型的两个属性之间创建。
属性中的 invalidated 事件和 changed 事件
属性JavaFX 中的属性与基础数据(int,double,boolean 等)一一对应,可以认为是对基础数据进行了包装,相较基础数据,
属性最大的区别就是属性对 “失效、修改” 等事件可以做出反馈。
所有读写JavaFX属性都支持绑定
Property接口新增了五个方法来支持绑定:
void bind(ObservableValue<? extends T> observable) //在此属性和指定的ObservableValue之间添加了单向绑定。
void unbind() //解除单向绑定
void bindBidirectional(Property<T> other) //建立双向绑定
void unbindBidirectional(Property<T> other) //解除双向绑定
boolean isBound() //判断该属性是否被绑定
惰性求值:惰性求值(Lazy Evaluation)是一种编程语言的特性,它在需要运算结果时才会进行计算,而不是在定义时就立即计算。
这种方式可以避免不必要的计算,提高程序的效率。
急性求值:表达式在它被约束到变量的时候就立即求值,
7、处理属性无效事件
刚创建一个属性对象时,它是有效的,将属性值更改时会触发一个失效事件,而此时再更改属性值时,将不会触发失效事件,因为此时值
已经是失效的。当使用get方法读取该值时,它将再次有效,然后再将相同的值赋给该变量也不会触发失效事件,因为该值没有真正改变。
如果将不同的值赋给该变量时还是会触发失效事件。
8、处理属性更改事件
使用.addListener();
属性使用对其值的动态求值来生成更改事件,因为它必须将新值传递给属性更改侦听器。
9、失效事件和更改事件对比
性能:失效优于更改
原因:无效侦听器使惰性计算值成为可能;一行中的多个无效操作只触发一个无效事件。
一般情况不用读取属性值使用无效监听器反之用更改监听器
10、在JavaFX中使用绑定
在JavaFX中,绑定是一个求值的表达式。它由一个或多个被称为依赖项的可观察值组成。绑定观察其依赖项的变化,并自动重新计算其值。
在内部,绑定将失效侦听器添加到它的所有依赖项。当它的任何依赖项无效时,它将自己标记为无效。一个无效的绑定并不意味
着它的值已经改变。这意味着它需要在下次请求该值时重新计算它的值。
11、单向和双向绑定
单向绑定:不能直接更改绑定属性的值,它的值必须根据绑定自动计算,在直接更改其值之前,必须解除绑定。
只能有一个单项绑定。
双向绑定:只能在两个类型相同的属性之间进行绑定,可以独立更改,也可以具有多个双向绑定。
12、绑定API
分为两类:高级绑定API
低级绑定API
12.1、高级绑定API
高级绑定API:由Fluent API和Bindings类组成
12.1.1 Fluent API
非流畅API ----------------------> 流畅API
x.add(y); x.add(z); ------------->x.add(y).add(z);
12.1.2 Binding 接口
• public void dispose() //可以删除对其他对象的引用,在内部使用弱失效监听器
• public ObservableList<?> getDependencies() //仅用于调试
• public void invalidate() //使绑定失效
• public boolean isValid() //判断绑定是否有效
为任何类型的对象创建绑定
ObjectExpression+ObjectBinding
12.1.3、三元表达式
new When(condition).then(value1).otherwise(value2)
12.2、低级绑定API
三步(1)创建一个拓展其中一个绑定类的类。
(2)调用父类的bind()方法绑定所有依赖项
(3)重写超类的computeValue()方法来编写绑定的逻辑。
13、创建一个圆心在画面中央的圆
将圆心的x坐标与scene的宽度的一半绑定,将y坐标与scene的高度的一半绑定
将圆的半径大小与宽度的一半和高度的一半较小的那个值绑定
总结
1、Java类可以包含两种类型的成员:字段和方法。字段表示对象的状态,它们被声明为
私有的。公共方法,称为访问器或getter和setter,用于读取和修改私有字段。对其
全部或部分私有字段具有公共访问器的Java类称为Java bean,这些访问器定义bean
的属性。Java bean的属性允许用户自定义其状态、行为或两者兼而有之。
2、JavaFX通过属性和绑定api支持属性、事件和绑定。JavaFX中的属性支持是JavaBeans
属性的一个巨大飞跃。JavaFX中的所有属性都是可观察的。可以观察它们的失效和值
的变化。您可以具有读/写或只读属性。所有读/写属性都支持绑定。在JavaFX中,属
性可以表示一个值或一个值的集合。
3、当属性值的状态第一次从有效变为无效时,属性会生成一个无效事件。JavaFX中的属
性使用延迟求值。当无效属性再次变为无效时,不会生成无效事件。无效的属性在重新
计算时变为有效。
4、在JavaFX中,绑定是一个求值的表达式。它由一个或多个被称为依赖项的可观察值组成。
绑定观察其依赖项的变化,并自动重新计算其值。JavaFX对所有绑定使用延迟求值。
当绑定最初定义时,或者绑定的依赖项发生变化时,它的值被标记为无效。无效绑定
的值将在下次请求时计算。JavaFX中的所有属性类都内置了对绑定的支持。
5、绑定有一个方向,即更改传播的方向。JavaFX支持两种属性绑定:单向绑定和双向绑定。
单向绑定只在一个方向上工作;依赖项的更改会传播到绑定属性,而不是相反。
双向绑定在两个方向上工作;依赖项的更改反映在属性中,反之亦然。