JAVA FX語(yǔ)法學(xué)習(xí)----數(shù)據(jù)綁定和觸發(fā)器
Posted on 2010-01-15 14:35 asdtiang 閱讀(1120) 評(píng)論(0) 編輯 收藏 所屬分類: java fx學(xué)習(xí)筆記bind
關(guān)鍵字將目標(biāo)變量的值與綁定表達(dá)式的值相關(guān)聯(lián)。綁定表達(dá)式可以是某個(gè)基本類型的簡(jiǎn)單值、對(duì)象、函數(shù)的結(jié)果或表達(dá)式的結(jié)果。以下幾節(jié)分別提供每種綁定表達(dá)式
的示例。
![]() |
在大多數(shù)實(shí)際的編程情況下,需要通過(guò)數(shù)據(jù)綁定使應(yīng)用程序的圖形用戶界面 (Graphical User Interface, GUI) 與其底層數(shù)據(jù)同步。(GUI 編程是使用 JavaFX 構(gòu)建 GUI 應(yīng)用程序的主題;下面我們將用一些非可視的示例來(lái)說(shuō)明基本的底層結(jié)構(gòu)。)
讓我們先看一個(gè)簡(jiǎn)單的示例:下面的腳本將變量 x
綁定到變量 y
,
更改 x
的值,然后輸出 y
的值。由于這兩個(gè)變量綁定在一起,因此 y
值會(huì)自動(dòng)更新為新值。
var x = 0; |
請(qǐng)注意,我們已將變量 y
聲明為 def
。這可防止任何代碼直接
為該變量賦值(盡管允許該變量的值因綁定 (bind
) 而更改)。在綁定到對(duì)象時(shí),此約定仍適用(請(qǐng)回顧使
用對(duì)象中介紹的 Address
):
var myStreet = "1 Main Street"; |
如果更改 myStreet
的值,address
對(duì)象內(nèi)部的 street
變量將受到影響:
address.street == 1 Main Street |
請(qǐng)注意,更改 myStreet
的值實(shí)際上會(huì)導(dǎo)致創(chuàng)建一個(gè)新的 Address
對(duì)象,然后將該對(duì)象重新賦給 address
變量。為了跟蹤所做的更改而不創(chuàng)建新的 Address
對(duì)象,請(qǐng)改為直接綁定 (bind
) 到該對(duì)象的實(shí)例變量:
def address = bind Address { |
如果要顯式綁定到實(shí)例變量,還可以省略第一個(gè) bind
(Address
前面的那個(gè)):
def address = Address { |
![]() |
前面的課程已講授了函數(shù),但是您還必須了解綁定函數(shù)與非綁定函數(shù)之間的區(qū)別。
請(qǐng)考慮下面的函數(shù),該函數(shù)創(chuàng)建和返回一個(gè) Point
對(duì)象:
var scale = 1.0; |
這就是所謂的綁定函數(shù),因?yàn)樗懊嬗?bound
關(guān)鍵字。
注意:bound
關(guān)鍵字不能替換bind
關(guān)鍵字;這兩個(gè)關(guān)鍵字按如下所示方式結(jié)合使用。
接下來(lái),讓我們添加一些代碼來(lái)調(diào)用此函數(shù)并測(cè)試綁定:
var scale = 1.0; |
此腳本的輸出如下所示:
3.0 |
讓我們分析一下此腳本(一次分析一部分)。
代碼:
var myX = 3.0; |
將腳本變量 myX
和 myY
初始化為 3.0
。
這些值隨后作為參數(shù)傳遞給 makePoint
函數(shù),該函數(shù)會(huì)創(chuàng)建并返回一個(gè)新的 Point
對(duì)象。bind
關(guān)鍵字(位于 makePoint
調(diào)用前面)將新創(chuàng)建的 Point
對(duì)象 (pt
) 綁定到 makePoint
函數(shù)的結(jié)果。
接下來(lái),代碼:
myX = 10.0; |
將 myX
的值更改為 10.0
并輸出 pt.x
的值。輸出表明 pt.x
現(xiàn)在也為 10.0
。
最后,代碼:
scale = 2.0; |
更改 scale
的值并再次輸出 pt.x
的值。pt.x
的值現(xiàn)在為 20.0
。但是,如果我們從該函數(shù)中刪除 bound
關(guān)鍵字(從而使其成為非綁定函數(shù)),則輸出應(yīng)為:
3.0 |
這是因?yàn)椋墙壎ê瘮?shù)只是在其某個(gè)參數(shù)發(fā)生變化時(shí)才被重新調(diào)用。由于 scale
不是函數(shù)的參數(shù),因此更改它的值將不會(huì)導(dǎo)致另一個(gè)函數(shù)調(diào)用。
![]() |
您還可以將 bind
與 for
表達(dá)式結(jié)合使用。為了對(duì)此進(jìn)行研究,讓我們首先定義兩個(gè)序列并輸出這兩個(gè)序列中各個(gè)項(xiàng)的值:
var seq1 = [1..10]; |
seq1
包含十個(gè)項(xiàng)(數(shù)字 1 至 10)。seq2
也包含十個(gè)項(xiàng);這些項(xiàng)本來(lái)會(huì)與 seq1
具有相同的值,但是我們已經(jīng)對(duì)其中的每個(gè)項(xiàng)都應(yīng)用了表達(dá)式 item*2
,
因此它們的值將加倍。
因此,輸出為:
First Sequence: |
我們可以通過(guò)將 bind
關(guān)鍵字放在 for
關(guān)鍵字前面來(lái)綁定這兩個(gè)序列。
def seq2 = bind for (item in seq1) item*2; |
問(wèn)題現(xiàn)在變成:“如果 seq1
發(fā)生了某些變化,那么是 seq2
中的所有項(xiàng)都受到影響還是部分項(xiàng)受到影響?”我們可以通過(guò)以下方法來(lái)對(duì)此進(jìn)行測(cè)試:將一個(gè)項(xiàng)(值 11)插入
seq1
的末尾處,然后輸出這兩個(gè)序列的值,看有什么變化:
var seq1 = [1..10]; |
輸出:
First Sequence: |
輸出表明,將 11 插入 seq1
的末尾處不會(huì)影響 seq2
中的前 10 個(gè)項(xiàng);新項(xiàng)會(huì)自動(dòng)添加到 seq2
的末尾處,其值為 22。
![]() |
替換觸發(fā)器是附加到變量的任意代碼塊,一旦變量的值發(fā)生變化,它們就會(huì)執(zhí)行。以下示例顯示了基本語(yǔ)法:
它定義一個(gè) password
變量并向其附加一個(gè)替換觸發(fā)器;當(dāng)密碼發(fā)生變化時(shí),該觸發(fā)器會(huì)輸出一則消息來(lái)報(bào)告此變量的新值:
var password = "foo" on replace oldValue { |
此示例的輸出如下所示:
ALERT! Password has changed! |
此示例中的觸發(fā)器引發(fā)兩次:當(dāng) password
初始化為 "foo"
時(shí)引發(fā)一次,當(dāng)其值變成 "bar" 時(shí)又引發(fā)一次。請(qǐng)注意,oldValue
變量存儲(chǔ)在調(diào)用觸發(fā)器之前變量的值。您可以將 oldValue
變量命名為任何所需的名稱,我們是由于該名稱具有描述性才恰好使用它。
天蒼蒼,野茫茫,風(fēng)吹草底見(jiàn)牛羊