2008年12月13日土曜日

JavaFX Data Binding and Triggers

Binding and Objects

変数同士を関連づけて、一方の値が変わると、もう一方も変わるのが Binding
  1. var x = 0;  
  2. def y = bind x;  
  3. x = 1;  
  4. println(y); // y now equals 1  
  5. x = 47;  
  6. println(y); // y now equals 47  

Address も bind できる
  1. var myStreet = "1 Main Street";  
  2. var myCity = "Santa Clara";  
  3. var myState = "CA";  
  4. var myZip = "95050";  
  5.   
  6. def address = bind Address {  
  7.   street: myStreet;  
  8.   city: myCity;  
  9.   state: myState;  
  10.   zip: myZip;  
  11. };  
  12.   
  13. println("address.street == {address.street}");  
  14. // address.street == 1 Main Street  
  15. myStreet = "100 Maple Street";  
  16. println("address.street == {address.street}");  
  17. // address.street == 1 Main Street  

この場合、新しい Object が作成されるが、 Object を作成しない方法もある
  1. def address = bind Address {  
  2.   street: bind myStreet;  
  3.   city: bind myCity;  
  4.   state: bind myState;  
  5.   zip: bind myZip;  
  6. };  

この場合、最初の bind を省略することができる
  1. def address = Address {  
  2.   street: bind myStreet;  
  3.   city: bind myCity;  
  4.   state: bind myState;  
  5.   zip: bind myZip;  
  6. };  



Binding and Functions
  1. var scale = 1.0;  
  2.   
  3. bound function makePoint(xPos : Number, yPos : Number) : Point {  
  4.   Point {  
  5.        x: xPos * scale  
  6.        y: yPos * scale  
  7.   }  
  8. }  
  9.   
  10. class Point {  
  11.   var x : Number;  
  12.   var y : Number;  
  13. }  
  14.   
  15. var myX = 3.0;  
  16. var myY = 3.0;  
  17. def pt = bind makePoint(myX, myY);  
  18. println(pt.x);  // 3.0  
  19.   
  20. myX = 10.0;  
  21. println(pt.x);  // 10.0  
  22.   
  23. scale = 2.0;  
  24. println(pt.x);  // 20.0  

bound を外すと、最後の出力は 10.0 になる


Binding with Sequences
  1. var seq1 = [1..10];  
  2. def seq2 = bind for (item in seq1) item*2;  
  3. printSeqs();  
  4.   
  5. function printSeqs() {  
  6.   println("First Sequence:");  
  7.   for (i in seq1){println(i);}  
  8.   println("Second Sequence:");  
  9.   for (i in seq2){println(i);}  
  10. }  
  11.   
  12. /* output 
  13. First Sequence: 
  14. 1 
  15. 2 
  16. 3 
  17. 4 
  18. 5 
  19. 6 
  20. 7 
  21. 8 
  22. 9 
  23. 10 
  24. Second Sequence: 
  25. 2 
  26. 4 
  27. 6 
  28. 8 
  29. 10 
  30. 12 
  31. 14 
  32. 16 
  33. 18 
  34. 20 
  35. */  


seq1 に item を追加すると、seq2 も変わる
  1. var seq1 = [1..10];  
  2. def seq2 = bind for (item in seq1) item*2;  
  3. insert 11 into seq1;  
  4. printSeqs();  
  5.   
  6. function printSeqs() {  
  7.   println("First Sequence:");  
  8.   for (i in seq1){println(i);}  
  9.   println("Second Sequence:");  
  10.   for (i in seq2){println(i);}  
  11. }  
  12.   
  13. /* 
  14. First Sequence: 
  15. 1 
  16. 2 
  17. 3 
  18. 4 
  19. 5 
  20. 6 
  21. 7 
  22. 8 
  23. 9 
  24. 10 
  25. 11 
  26. Second Sequence: 
  27. 2 
  28. 4 
  29. 6 
  30. 8 
  31. 10 
  32. 12 
  33. 14 
  34. 16 
  35. 18 
  36. 20 
  37. 22 
  38. */  



Replace Triggers

任意の変数をトリガーに使うことができる
次のコードは password 変数が変更されると、メッセージが表示される
  1. var password = "foo" on replace oldValue {  
  2.   println("\nALERT! Password has changed!");  
  3.   println("Old Value: {oldValue}");  
  4.   println("New Value: {password}");  
  5. };  
  6.   
  7. password = "bar";  
  8.   
  9. /* output 
  10. ALERT! Password has changed! 
  11. Old Value: 
  12. New Value: foo 
  13.  
  14. ALERT! Password has changed! 
  15. Old Value: foo 
  16. New Value: bar 
  17. */  

0 件のコメント:

コメントを投稿