JavaFX 2.0和Scala,像牛奶和餅干

JavaFX 2.0和Scala都是很好的技術,但是一起使用時效果會更好。 JavaFX 2.0是一種功能強大的富客戶端技術,具有先進的圖形,動畫和媒體功能。 Scala是一種簡單但功能強大的語言,具有用于編寫特定于域的語言(DSL)的高級語言功能。 將少量Scala UI DSL添加到JavaFX 2.0項目中,您將處在餅干和奶油的天堂!
羅比攝影藝術 授權的延時攝影創意共享地帶

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373452.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373452.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373452.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ASP.NET WebAPi之斷點續傳下載(上)

前言 之前一直感覺斷點續傳比較神秘&#xff0c;于是想去一探究竟&#xff0c;不知從何入手&#xff0c;以為就寫寫邏輯就行&#xff0c;結果搜索一番&#xff0c;還得了解相關http協議知識&#xff0c;又花了許久功夫去看http協議中有關斷點續傳知識&#xff0c;有時候發覺東西…

貪吃蛇(C++實現,VC6.0編譯,使用了EasyX圖形庫)

程序效果&#xff1a; 代碼&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

3.0 C++遠征:is a

4-4is_a 0.派生類Soldier繼承自基類Person //Person.h class Person { public:Person(string name "Jim");~Person();void play(); protected:string m_strName; };//Soldier.h class Soldier : public Person { public:Soldier(string name "James", in…

python中sorted的用法append_python sorted()排序詳解

排序&#xff0c;在編程中經常遇到的算法&#xff0c;我也在幾篇文章中介紹了一些關于排序的算法。有的高級語言內置了一些排序函數。本文講述Python在這方面的工作。供使用內置函數sorted()/list.sort()的使用簡單應用python對list有一個內置函數&#xff1a;>>> a[5…

云上的播放框架變得簡單:Openshift模塊

僅僅幾年前&#xff0c;找到一個負擔得起的Java Web應用程序托管解決方案是一項艱巨的任務&#xff0c;而尋找免費的托管解決方案是一項不可能的任務。 更不用說甚至考慮自動縮放&#xff0c;單命令部署&#xff0c;持續集成等事情&#xff0c;這都是科幻小說。 去年見證了云計…

C#中的yield return與Unity中的Coroutine(協程)(下)

Unity中的Coroutine&#xff08;協程&#xff09; 估計熟悉Unity的人看過或者用過StartCoroutine() 假設我們在場景中有一個UGUI組件&#xff0c; Image&#xff1a; 將以下代碼綁定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

字節流轉化為文件流_C#文件轉換為字節流及字節流轉換為文件

本文講解了C#實現文件轉換為字節流的方法。文件轉換為字節流的步驟如下1、通過文件流打開指定文件(FileStream fs)&#xff1b;2、定義字節流(byte[] fileBytenew byte[fs.Length])&#xff1b;3、把文件讀取到字節流(fs.Read(fileByte,0,fileByte.Length))&#xff1b;4、關閉…

Spring和JSF集成:導航

我希望這是有關我在Spring和JavaServer Faces之間提供深度集成的努力的一系列博客中的第一篇。 這里提到的所有內容都是“正在進行中的工作”&#xff0c;因此&#xff0c;如果您簽出代碼&#xff0c;請注意它是一個不斷變化的目標。 期待一些粗糙的邊緣&#xff0c;如果有時會…

【CSS3動畫】transform對文字及圖片的旋轉、縮放、傾斜和移動

前言&#xff1a;之前我有寫過CSS3的transform這一這特性&#xff0c;對于它的用法&#xff0c;還不是很透徹&#xff0c;今天補充補充&#xff0c;呵呵 你懂的&#xff0c;小司機準備開車了。 a)再提一提transform的四個屬性 ①旋轉--->rotate(參數a)&#xff0c;單位deg&a…

宏的用法與簡介

預處理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因為他們由預處理器解釋的&#xff0c;所以稱作預處理指令。預處理器讀取源代碼&#xff0c;然后對其修改&#xff0c;并把修改過的…

django 日志寫入mysql_如何將django orm模型 寫入數據庫

1、指定連接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置連接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的數據庫名稱USER: root, #你的數據庫用戶名PASSWORD: , #你的數…

ORM的問題第2部分–查詢

在我以前關于對象關系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我討論了在處理當今常見的ORM&#xff08;包括Hibernate&#xff09;時遇到的各種問題。 其中包括與從POJO生成架構有關的問題&#xff0c;實際性能和不斷出現的維護問題。 本質上&#xff0c;結論…

【轉】如何減少接口響應時間

Premature optimization is the root of all evil. — Donald Knuth 對于程序優化&#xff0c;我一直采取保守的態度&#xff0c;除非萬不得已。但是隨著業務的不斷發展&#xff0c;程序越來越復雜&#xff0c;代碼越寫越多&#xff0c;優化似乎是終有一天會到來的事情。 那么對…

數據庫行轉列在現實需求中的用法

select t.客戶姓名,sum(case when t.收款類型首款 then t.金額 else 0 end as 首款),sum(case when t.收款類型尾款 then t.金額 else 0 end as 尾款) from table t group by t.客戶姓名 這段sql的意思 是 查詢出所有客戶收款信息 然后按客戶分組 分組后 然后將這個客戶的所…

mysql生產環境加索引_【生產篇】_MySQL環境下如何查看基于表的索引定義

【引言】今天中午項目組來一需求&#xff0c;欲在MySQL環境的某張表下創建幾個BTREE索引。要創建索引&#xff0c;首先需要了解基表的表結構&#xff0c;以及已經包含的索引。Oracle的表結構大家都很熟悉&#xff0c;但MySQL表結構和已創建索引的查看怎么操作&#xff0c;本文將…

Hadoop模式介紹-獨立,偽分布式,分布式

了解了什么是Hadoop之后&#xff0c;讓我們在單機上啟動Hadoop&#xff1a; 這篇文章包含在ubuntu上安裝Hadoop的說明。 這是Hadoop安裝的快速分步教程。 在這里&#xff0c;您將獲得以獨立模式 &#xff08;單節點集群&#xff09;安裝Hadoop所需的所有命令及其說明&#xff0…

apk反編譯方式

一、Apk反編譯得到Java源代碼 下載上述反編譯工具包&#xff0c;打開apk2java目錄下的dex2jar-0.0.9.9文件夾&#xff0c;內含apk反編譯成java源碼工具&#xff0c;以及源碼查看工具。 apk反編譯工具dex2jar&#xff0c;是將apk中的classes.dex轉化成jar文件 源碼查看工具jdgui…

優化Hibernate所鼓勵的7大措施

優化Hibernate所鼓勵的7大措施&#xff1a; 1.盡量使用many-to-one&#xff0c;避免使用單項one-to-many2.靈活使用單向one-to-many3.不用一對一&#xff0c;使用多對一代替一對一4.配置對象緩存&#xff0c;不使用集合緩存5.一對多使用Bag 多對一使用Set6.繼承使用顯示多態 HQ…

如何用c 控制mysql數據庫_用C語言操作MySQL數據庫

函數描述mysql_affected_rows()返回上次UPDATE、DELETE或INSERT查詢更改&#xff0f;刪除&#xff0f;插入的行數。mysql_autocommit()切換autocommit模式&#xff0c;ON/OFFmysql_change_user()更改打開連接上的用戶和數據庫。mysql_charset_name()返回用于連接的默認字符集的…

數據結構(RMQ):POJ 3624 Balanced Lineup

Balanced LineupDescription For the daily milking, Farmer Johns N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a conti…