JavaFX 2.0和Scala,像牛奶和饼干
JavaFX彩色圓圈
我將稍微詳細(xì)說(shuō)明為什么Scala,但是我相信所有這些都可以通過(guò)代碼示例得到最好的說(shuō)明。 SDK隨附的JavaFX 2.0功能的基本示例之一是一個(gè)名為ColorfulCircles的示例應(yīng)用程序。 完整的源代碼可以在這里找到:
– Java彩色圓圈代碼
在Sven Reimers的幫助下,我們將其移植到了ScalaFX庫(kù)頂部的Scala中。 可在此處找到可用的應(yīng)用程序源:
– ScalaFX彩色圓圈代碼
更新 :Dean Iverson在GroovyFX中有一個(gè)很好的例子,說(shuō)明了相同的代碼
隨意隨意閱讀源代碼,并注意以下幾點(diǎn):
1. ScalaFX更簡(jiǎn)潔
ScalaFX版本的行數(shù)和字符數(shù)都更短。
代碼計(jì)數(shù)(不包括許可證和進(jìn)口):
- 行數(shù):
- Java:48
- 字符:
- Java:1602
這是由于定制量身定制的DSL語(yǔ)言具有完整的表現(xiàn)力和較少的冗余。 在Java版本的代碼中,您會(huì)注意到該語(yǔ)言所需的更多樣板和語(yǔ)法重復(fù)。
2. ScalaFX代碼看起來(lái)像輸出
雖然“彩色圓圈”示例的輸出非常簡(jiǎn)單,但實(shí)際上在結(jié)構(gòu)化方式方面隱藏了相當(dāng)多的復(fù)雜性。 這是使用ScalaFX從JavaFX 2.0 Build 45運(yùn)行的輸出:
您實(shí)際看到的是一個(gè)由以下幾層組成的SceneGraph:
- 黑色背景的場(chǎng)景,包含……
- 包含以下內(nèi)容的組
在閱讀ScalaFX代碼時(shí),您可以通過(guò)場(chǎng)景中節(jié)點(diǎn)的對(duì)象文字樣式聲明來(lái)嵌套該內(nèi)容,摘錄如下:
// ScalaFX Scene Excerpt: scene = new Scene {content = Seq(new Group {circles = for (i <- 0 until 30) yield new Circle { ... }}new Rectangle { ... }) }但是,Java版本沒(méi)有為您提供相同的層次結(jié)構(gòu)表示,而是使用了對(duì)構(gòu)造函數(shù),getter和collection方法的命令式調(diào)用。
3.量身定制的動(dòng)畫(huà)語(yǔ)法
動(dòng)畫(huà)在創(chuàng)建良好的UI時(shí)非常常用,這就是JavaFX Script具有內(nèi)置結(jié)構(gòu)以簡(jiǎn)化動(dòng)畫(huà)創(chuàng)建的原因。 ScalaFX具有類似的語(yǔ)法,使您可以快速輕松地創(chuàng)建動(dòng)畫(huà),該動(dòng)畫(huà)在ColorfulCircles示例中使用:
Seq(at(0 s) {circle.centerX -> random * 800},at(0 s) {circle.centerY -> random * 600},at(40 s) {circle.centerX -> random * 800},at(40 s) {circle.centerY -> random * 600} )這樣可以輕松創(chuàng)建復(fù)雜的動(dòng)畫(huà)。
4. ScalaFX版本具有隱藏的獎(jiǎng)金功能…
與JavaFX版本不同,內(nèi)容綁定到舞臺(tái)的寬度和高度。 ScalaFX中的綁定就像用綁定運(yùn)算符(<==)替換賦值運(yùn)算符(=)一樣簡(jiǎn)單,如下所示:
// ScalaFX Property Setting: width <== scene.width height <== scene.height盡管這是ScalaFX中操作員的簡(jiǎn)單更改,但它需要足夠復(fù)雜的代碼,因此他們決定從JavaFX示例中忽略它。 下面是對(duì)Java的寬松翻譯:
// Java Fixed Property Binding colors.widthProperty().bind(scene.widthProperty()) colors.heightProperty().bind(scene.heightProperty())雖然,Java語(yǔ)法中的精確等效代碼實(shí)際上如下所示:
// Java Dynamic Property Binding colors.widthProperty().bind(Bindings.selectDouble(primaryStage.sceneProperty(), "width")) colors.heightProperty().bind(Bindings.selectDouble(primaryStage.sceneProperty(), "height"))這些版本中的任何一個(gè)都比同等的ScalaFX更復(fù)雜和笨拙,這是用于非常簡(jiǎn)單的綁定!
關(guān)于ScalaFX
ScalaFX是用Scala語(yǔ)言編寫(xiě)的UI DSL,它位于JavaFX 2.0之上(不要與Ingo Maier在Swing的功能性反應(yīng)式編程方面 的出色工作相混淆)。 這意味著每個(gè)ScalaFX應(yīng)用程序也是一個(gè)有效的Scala應(yīng)用程序。 通過(guò)擴(kuò)展,它支持與Java的完全互操作性,并且可以在支持Java虛擬機(jī)(JVM)和JavaFX 2.0的任何地方運(yùn)行。
ScalaFX的一些功能包括:
程序員友好的對(duì)象文學(xué)類語(yǔ)法
ScalaFX使用簡(jiǎn)單的分層模式創(chuàng)建新對(duì)象并構(gòu)建場(chǎng)景圖。 這是一個(gè)簡(jiǎn)單的示例,該示例創(chuàng)建一個(gè)具有矩形的新舞臺(tái),該矩形會(huì)根據(jù)鼠標(biāo)事件更改顏色:
stage = new Stage {title.value = "Hello Stage"width = 600height = 450scene = new Scene {fill = Color.LIGHTGREENcontent = new Rectangle {x = 25y = 40width = 100height = 100fill <== when (hover) then Color.GREEN otherwise Color.RED}}visible = true }與您在核心JavaFX API中找到的構(gòu)建器不同,ScalaFX對(duì)象聲明語(yǔ)法使用常規(guī)對(duì)象API。 這意味著您可以使用相同的運(yùn)算符和方便的語(yǔ)法來(lái)創(chuàng)建和修改場(chǎng)景圖。 同樣,在構(gòu)造對(duì)象時(shí),也可以內(nèi)聯(lián)完成Scala塊中允許的任何事情(例如變量聲明,方法調(diào)用,綁定等)。 對(duì)于JavaFX構(gòu)建器,您需要在完成創(chuàng)建對(duì)象后聲明綁定,這將導(dǎo)致分離和難以維護(hù)的代碼。
自然語(yǔ)言綁定表達(dá)式
將Scala語(yǔ)言用作DSL的最大優(yōu)勢(shì)之一是對(duì)操作員方法的豐富支持。 這類似于C ++運(yùn)算符重載的概念,但是在其應(yīng)用程序中更加統(tǒng)一和簡(jiǎn)潔。
ScalaFX綁定庫(kù)在所有可綁定對(duì)象的頂部公開(kāi)了常規(guī)運(yùn)算符,例如&&,||,+,-,*,/。 而且,Scala支持運(yùn)算符優(yōu)先級(jí),因此即使您在幕后創(chuàng)建綁定對(duì)象,它的外觀也感覺(jué)像您在編寫(xiě)正則表達(dá)式。 因此,您具有JavaFX 2.0綁定庫(kù)中可用的全部功能,其代碼類似于數(shù)學(xué)表達(dá)式和運(yùn)算符。 以下是一些可以使用ScalaFX綁定API進(jìn)行操作的示例: 中綴加/減/乘/除/等
綜合運(yùn)營(yíng)商
width <== max(rect1.width, rect2.width, rect3.width)條件表達(dá)式
color <== when (hover) then Color.GREEN otherwise Color.RED復(fù)雜的布爾表達(dá)式和字符串連接
text <== when (rect.hover || circle.hover && !disabled) then textField.text + " is enabled" otherwise "disabled"自由格式的無(wú)效和變更處理程序
rect.hover onInvalidate {needsRepaint = true }完全類型安全的API
這似乎似乎無(wú)關(guān)緊要……類型安全性是Java開(kāi)發(fā)人員一直擁有的(并且常常認(rèn)為是理所當(dāng)然的),而使用其他腳本語(yǔ)言的開(kāi)發(fā)人員則沒(méi)有(并且在不知不覺(jué)中遭受運(yùn)行時(shí)錯(cuò)誤的困擾)。 但是,如果要開(kāi)發(fā)的應(yīng)用程序在部署后不會(huì)出現(xiàn)意外的運(yùn)行時(shí)錯(cuò)誤和錯(cuò)誤,則此功能至關(guān)重要。
一個(gè)好的編譯器將能夠通過(guò)比較預(yù)期類型和實(shí)際類型來(lái)發(fā)現(xiàn)許多常見(jiàn)的編碼錯(cuò)誤,而一個(gè)好的編譯器(例如Scala)將為您自動(dòng)推斷類型,因此您不必在整個(gè)代碼中繁瑣地重復(fù)它們。
ScalaFX通過(guò)類似腳本的DSL語(yǔ)法獲得了兩全其美的優(yōu)勢(shì),您幾乎不需要顯式地鍵入對(duì)象,而Scala編譯器具有強(qiáng)大的類型安全性,可以推斷并檢查每個(gè)表達(dá)式和API調(diào)用的類型。 這意味著更少的時(shí)間花費(fèi)在調(diào)試怪異的代碼錯(cuò)誤和拼寫(xiě)錯(cuò)誤上,而質(zhì)量更高的代碼馬上就可以使用了!
無(wú)縫的JavaFX / ScalaFX互操作性
通常情況下,您對(duì)代碼庫(kù)或包含功能的庫(kù)的主要語(yǔ)言沒(méi)有完全的自由。 即使在具有Java,Scala以及可能還有其他JVM語(yǔ)言的混合環(huán)境代碼庫(kù)中,ScalaFX也會(huì)無(wú)縫地進(jìn)行轉(zhuǎn)換和互操作。
ScalaFX通過(guò)Scala的隱式運(yùn)算符功能獲得此功能。 程序在需要JavaFX類型的對(duì)象的任何地方,它將自動(dòng)插入代碼以將ScalaFX包裝的對(duì)象轉(zhuǎn)換為JavaFX本機(jī)類。 每當(dāng)您使用ScalaFX特定功能時(shí),編譯器都會(huì)自動(dòng)創(chuàng)建一個(gè)ScalaFX包裝器對(duì)象,該對(duì)象可用于調(diào)用高級(jí)方法并訪問(wèn)全部功能。 所有這一切都在幕后發(fā)生,使您可以專注于編寫(xiě)簡(jiǎn)潔的代碼,而不必大為擔(dān)心集成和互操作性。
由于所有這些互操作性魔術(shù)都在幕后發(fā)生,因此您的應(yīng)用程序會(huì)有一些額外的開(kāi)銷。 我們已盡力使用Scala語(yǔ)言中的@specialize之類的功能來(lái)最小化此問(wèn)題,這使我們能夠避免在基元上進(jìn)行裝箱和拆箱。 但是,沒(méi)有真正的基準(zhǔn),很難說(shuō)出我們所做的工作有多好。 希望在以后的文章中對(duì)此有更多的了解。
了解有關(guān)ScalaFX的更多信息
ScalaFX項(xiàng)目站點(diǎn)由Google Code托管,其中包括一些郵件列表,如果您有興趣,則應(yīng)加入該列表:
- ScalaFX用戶
- ScalaFX開(kāi)發(fā)人員
在撰寫(xiě)本文時(shí),我們還沒(méi)有捆綁發(fā)行版,但對(duì)早期采用者的反饋感興趣。 如果您想嘗試一下,請(qǐng)下載源代碼并快速旋轉(zhuǎn)一下!
在即將舉行的Dean Iverson的JavaOne研討會(huì)上,我將獲得有關(guān)ScalaFX的更多詳細(xì)信息,主題為“ 帶有替代語(yǔ)言的JavaFX 2.0 ”。 來(lái)聽(tīng)聽(tīng)有關(guān)Scala,Groovy和其他JVM語(yǔ)言的更多信息,您可以使用它們編寫(xiě)更簡(jiǎn)單,更簡(jiǎn)潔的代碼。
參考: JavaFX 2.0和Scala,例如來(lái)自我們JCG合作伙伴的 牛奶和餅干 ? Steve On Java博客上的Stephen Chin。
翻譯自: https://www.javacodegeeks.com/2012/02/javafx-20-and-scala-like-milk-and.html
總結(jié)
以上是生活随笔為你收集整理的JavaFX 2.0和Scala,像牛奶和饼干的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Twitter4j和Esper:在Twi
- 下一篇: OSGi简介–模块化Java