自覺有一些java基礎,買了一本Pro Java FX 2想要變長java FX Pro,事實證明:我想太多,讀到第二章前半段,不知道是書中範例有深度還是我還太淺,我還要搭配著http://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm看才稍微有點頭緒,接下來就分享一下今日讀書心得,有錯的地方麻煩各位高手多指點指點。
java FX中的Property最上層是interface,置於javafx.beans.property底下,其中有各種基本型態(int, double, boolean)的class實作該介面,例如IntegerProperty、DoubleProperty、StringProperty等,
節錄DoubleProperty API說明
public abstract class DoubleProperty
extends ReadOnlyDoubleProperty
implements Property<java.lang.Number>, WritableDoubleValue
ReadOnlyDoubleProperty以及WritableDoubleValue分別是包裹了取值(get)以及設值(set)的方法,這隱含了Property的設計概念就是從JavaBean來的,而再做一些修改。
另外重要的新特性是Binding的概念,可以把一個Property物件bind到一個任何實作ObervableValue介面的物件,關於Obervable要於下次part 2時再分享,我現在也不是很清楚,但是最簡單的binding就是把兩個Property binding,另外要提的是,binding可以是單向也可以是雙向,單向的意思是被綁定(bound)的物件不能set新值,否則會產生Runtime Exception,而綁定的物件(Dependency)則可以設定新值,雙向的話被綁定以及綁定皆可以設值,且同時兩邊會設定成一樣的值(背後機制跟Invalidate Event有關,下篇討論),簡單範例如下:
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
public class PropertiesTest {
public void displayProperty(){
DoubleProperty dp=new SimpleDoubleProperty(3.14);
DoubleProperty dp2= new SimpleDoubleProperty(0);
System.out.println("Before Binding");
System.out.println(dp.get()); //3.14
System.out.println(dp2.get()); // 0.0
dp2.bind(dp);
System.out.println("After Binding");
System.out.println(dp.get()); // 3.14
System.out.println(dp2.get()); //3.14
dp.set(5.68); //設定新值
System.out.println("Dependency Value Changes");
System.out.println(dp.get()); // 5.68
System.out.println(dp2.get()); //5.68
dp2.set(6.99); //設定被綁定的物件新值
System.out.println("Only One Changes");
System.out.println(dp.get()); // 5.68
System.out.println(dp2.get()); // java.lang.RuntimeException: A bound value cannot be set.
dp2.unbind();//解除綁定
dp2.bindBidirectional(dp); //雙向
dp2.set(6.99); //設定被綁定的物件新值
System.out.println("Bidirection Changes");
System.out.println(dp.get()); // 6.99
System.out.println(dp2.get()); // 6.99
}
}