


JavaFX彩色圓圈
我將稍微詳細說明為什么Scala,但是我相信所有這些都可以通過代碼示例得到最好的說明。 SDK隨附的JavaFX 2.0功能的基本示例之一是一個名為ColorfulCircles的示例應用程序。 完整的源代碼可以在這里找到:
– Java彩色圓圈代碼
在Sven Reimers的幫助下,我們將其移植到了ScalaFX庫頂部的Scala中。 可在此處找到可用的應用程序源:
– ScalaFX彩色圓圈代碼
更新 :Dean Iverson在GroovyFX中有一個很好的例子,說明了相同的代碼
隨意隨意閱讀源代碼,并注意以下幾點:
1. ScalaFX更簡潔
ScalaFX版本的行數和字符數都更短。
代碼計數(不包括許可證和進口):
- 行數:
- Java:48
- 字符:
- Java:1602
這是由于定制量身定制的DSL語言具有完整的表現力和較少的冗余。 在Java版本的代碼中,您會注意到該語言所需的更多樣板和語法重復。
2. ScalaFX代碼看起來像輸出
雖然“彩色圓圈”示例的輸出非常簡單,但實際上在結構化方式方面隱藏了相當多的復雜性。 這是使用ScalaFX從JavaFX 2.0 Build 45運行的輸出:

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