【jxh118】JavaFX知多少
常见问题
F7YOsR0ITPUB个人空间
? ^/E0j"i1x(b
JavaFX是什么?
0] Ynq lP(c+f0
t9a[7k_k0“JavaFX 脚本是一种声明式、静态类型编程语言。它具有一等函数(first-class functions)、声明式的语法、列表推导(list-comprehensions)及基于依赖关系的增量式求值(incremental dependency-based evaluation)等特征。”JavaFX脚本为多种多样的操作提供了声明式、无中间程序逻辑的语法,这些操作包括创建2D动画、设置属性或者声明在模式和视图对象之间的绑定依赖关系。
X~!Bm,ug_c7|0ITPUB个人空间
lVd(y;xzb1N
?
X
什么样的函数能够称为“first-class functions”?ITPUB个人空间0x*r4S6HHc@h
5u3AE6z,M`M"x0在编程语言中,我们常常把那些将函数作为一等对象的函数称为一等函数(first-class functions)。具体地说,就是编程语言支持在程序执行过程中构造新的函数,并将它们存储在数据结构中作为其它函数的参数的传入参数,并在函数返回时将它们作为函数值返回。本概念并不涵盖任何语言和程序的外部函数或者程序,例如通过调用编译器或者一个eval函数来创建新函数。ITPUB个人空间 TF;guM+w
这里提供一等函数的一个简单示例:map或者mapcar函数,它使用一个函数和一个列表作为参数,然后将通过将函数应用到列表中的每个成员后形成的列表作为返回值。
0pjr?Q*CT K0ITPUB个人空间+drWN:{pb
“declarative syntax”是什么意思?
d:p#AT#h\!c0
J"}+o O%N)i"x0与大多数依靠程序和显式代码来更新在变量或者属性之间关系的编程语言不同,声明式语言允许数值被声明为另一种方式。ITPUB个人空间qa*FlS"}em
在JavaFX的一个示例:
0U3G}LG+^Y0var a : Number = bind model.attrib/2;
:NB2O(w
hEf7T%{0无论何时model.attrib的数值发生改变,a的数值都将自动、透明地更新,更新期间无需调用任何程序。这对于在模式和视图对象之间绑定依赖关系、控制GUI行为是特别有用的。
c$DC{"x$f6L0ITPUB个人空间i3a+Az/G
“list-comprehensions”是什么意思?
v6~.N:[i0i8?0
2Y
FLC
J2r`jC0我们常常把“list-comprehensions”翻译为“列表推导”。列表推导是在语言级别上支持以多种方式创建、维护列表的方法。
]R)jh k}6p}.gy0在JavaFX中的一些示例:
5~4j|AO^0var nums = [1,2,3,4]; var nums2 = [1..4]; //same as above var numsGreaterThanTwo = nums[. > 2]; var numsLessThanFour = select n from n in nums where n < 4;
r:{Ed.j0ITPUB个人空间/Q*E8O*a
lZ:E]@
什么是"incremental dependency-based evaluation"?
I|/dd.BOhN0
gmtn'x[0“incremental dependency-based evaluation”译为“基于依赖关系的增量式求值”。在JavaFX中,属性值能够被声明为依赖于(绑定到)包含其它属性的表达式。这样,当某个被引用的属性数值发生变化时,所有依赖此属性的属性都将直接或者间接地改变它们的数值,此过程无需调用任何的中间程序逻辑。这和在Excel之类的电子表格中使用方程式很类似。ITPUB个人空间g;ZKk/U
F:^w!G
这对于那些需要动态维护模式和视图属性,而又时常需要复杂的程序逻辑的GUI开发来说非常有用。ITPUB个人空间:Yj8E^@.? l6um^
ITPUB个人空间a#S@2Mc"l%J@EK
“操作(operation)” vs “函数(function)”
5X8Y q^YoY2e,^U2E0
"SQ eTL;`C1MYw]x0函数与操作之间的不同之处是函数可以递增地反复求值、可以绑定返回值、绑定参数、绑定变量/属性,隐性绑定本地变量。ITPUB个人空间)|sZ)O+N}X
为了进一步说明,请看下面的JavaFX代码片段:ITPUB个人空间Qv!A.\W
Class Foo ( attribute zap; function bar(x) { x + zap }}var afoo = Foo { zap: 14 }var zing = 1;var snap = afoo.bar(zing);bind dyn = afoo.bar(zing);ITPUB个人空间Fr{br*_L
我们非常清楚地看到:无论zing和zap如何变化,snap将不会发生变化。而dyn则会随着zing和zap的变化而改变。因为在zing和zap的数值发生变化时,发生了一个增量式的求值过程:程序将变化的数值传递给依赖其的所有函数,并重新计算数值。ITPUB个人空间 F*w
Y'UmM9^
X0F)p/xAy$v0JavaFX的授权模式是怎么的?
;m.SDZ
_0
1c#}] bt.wWU&Z2_0JavaFX 的开发者很赞同让用户发布自己的应用,并坚信开源和社区的力量。但当前的JavaFX版本是在评估授权下发布的,因此并不能够被重新发布。你当然能够发布自己编写的基于JavaFX的应用,但不能够和JavaFX一起捆绑发布,并需要告之使用者:需要到openjfx项目站点下载JavaFX二进制代码库。并且,由于正处于早期的JavaFX代码还处在评估授权下,因此它不能用于商业用途。当Sun完成了JavaFX的商业化版本开发后,我相信这将会得到改变。
}\7C$KUB,e&d0ITPUB个人空间MOO,V"GM
Sun是否规定了发布JavaFX商业化产品的时间线?
6L5\ c)@\Q)zN0
f.J!t%e5Sg0很抱歉,目前没有准确的时间约定,不过马上就会制定出来。ITPUB个人空间
TiRmeuZ
ITPUB个人空间1hZ#wX Dv*n
JavaFX Runtime像JavaFX Script那样开源吗?ITPUB个人空间%V5G+l
sT
U6upi-UX+L0是的,JavaFX Runtime即将开放源代码。
H!vLX6yR!gk0
6q [ C9nZ
N3W~,}0在JavaFX和…之间的不同ITPUB个人空间T'iT:nN)Z.m
ITPUB个人空间|hVhG6HH
与F3比较:F3是Form. Follows Function的缩写,这是JavaFX平台从前的名字。ITPUB个人空间z5C&yfff6R:[}
2Gi.|(o;|(wt^w0与Java比较:JavaFX 是一种兼容JSR-223的脚本语言。它能够使用Java类,并从Java类中被调用。
RMj3@!K9YU_0
"xWo~T[K0与Java 6.0提供的Scriting Engine比较:Java 6.0提供的Scriting Engine为兼容JSR-223的脚本语言提供了运行平台,JavaFX可以在Java 6.0提供的Scriting Engine上执行。而JavaFX并不依赖于Java 6.0,它可以在任何兼容JSR-223的脚本引擎(比如javax.script.ScriptEngine)下执行。
^~i;^|c@0
LV&CU X0与SVG比较:SVG并不是一种程序语言;它是一种数据描述语言。其XML语法对于编程语言来讲是非常可怕的。但SVG的交互性、兼容性是令人满意的。目前 JavaFX开发团队并没有计划直接使用SVG。由于SVG和JavaFX都源自旧的PostScript和Java2D向量图形模式,因此在某种程度上,我们已经在JavaFX中使用了SVG,但目前仍然存在某些值得注意的不兼容性。ITPUB个人空间%{KQ-~K;Y)iac8v7Of
Chris Oliver 已经编写了SVG-to-F3 转换程序。
ZaU/^zM0
V/lv
g `,LY0A(p!bo0与Swing比较:JavaFX是一种编写Swing应用的新方式,它无需了解swing框架和java语言。
T)j}!{M0ITPUB个人空间7YBNX$Hu1u
与JavaScript比较:在JavaFX和JavaScript之间唯一相同点就是它们都是兼容JSR-223的脚本语言。
0ZtMZP_0ITPUB个人空间/O5MD,lq@t.I{
与Ajax比较:Ajax是使用了JavaScript和异步更新的web浏览器端技术。它与JavaFX的关系:两者都是UI相关的技术。但它们在语言和环境上完全不同。ITPUB个人空间/[:y g*jorv&IE5B
]q[}/r;d"p.eK0与Savaje OS的关系:Sun正在计划使用它们购买的Saveje手机系统和JVM来发布JavaFX Mobile,后者能在移动设备上运行JavaFX脚本,它将成为Windows Mobile、Flash Lite的有力竞争者。ITPUB个人空间.MqgP%K |4E
ITPUB个人空间4Z0};mzZnJ
我能够使用JavaFX编写Java3D应用吗?它兼容VRML或者X3D标准、Xj3D之类的代码库吗?ITPUB个人空间&kbE(j*T*j,a
ITPUB个人空间$@p[1uO:MA.@
没有原因不能使用。JavaFX能够和任何第三方代码库互操作,并且不需要任何特殊语法。目前JavaFX开发团队正在进行开发支持Java3D的功能。
S"F#B,pABK4P0
4wc)TEGTW&P5LEJc0JavaFX是一种RCP(Rich Client Platform) 吗?
1Y5{c;n4m2{.?
?0
-vRAQ4]TtnM
C0是的。JavaFX不仅能够用于RCP开发,也能够用于RIA(Rich internet Applications)开发。ITPUB个人空间-D@o!AP
?7?$Y
ITPUB个人空间9H,I&[A/Q2[o
我能够在web应用中使用JavaFX吗?
{0D
Q)w'ZAh0
U xv5ay%m6Q5i+R0JavaFX能够用于编写前端应用、web应用的视图或者用户接口,不过这都需要JVM的支持。ITPUB个人空间G7V,CMn Ql
"F)x
|XF4|Q"o0U0JavaFX将代替Java EE中的JSF和JSP吗?
0H$nB8G/_ @C_%C0ITPUB个人空间,uW:yf_.H _
不, JSF和JSP用于编写纯粹的web应用(对于支持HTML的HTTP客户端来讲是可用的),而JavaFX需要位于客户端的JVM。如果你希望编写富客户端的话,那么就需要在客户端安装JRE,JavaFX能够提供与基于Flash的Flex、基于.net的Silverlight相同的功能。常见的应用场景是开发运行在公司内网的应用。
]F9c*ha@0ITPUB个人空间2lAI2z%hoFPts
JavaFX在运行时需要服务器吗?ITPUB个人空间U0Y#\z@ Iz0Rz
I
{B\6Iq9n?O0JavaFX是一种关注GUI的脚本语言;它主要用于桌面应用,因此不需服务器。如果你计划部署JNLP(Java Web Start)的话,那么你需要一台web服务器。ITPUB个人空间.Q/v&lF5V
}&jr1MlS6H0运行JavaFX需要什么条件?
{CS"J Q*R:l8aF0
-ru `M%_;A4T0两种条件任选其一:
G1|}l5oB m(N/Pr0Java5以上、一个兼容JSR-223的实现、JavaFX代码库;ITPUB个人空间I%rVw#|'M'P
Java6以上、JavaFX代码库。
(y*]!x\3j0
N5S\.A;P,u-m6i0目前有JavaFX可用的编译器吗?ITPUB个人空间s:IPoS
ITPUB个人空间En
RV;}
P_
OpenFX Compiler是JavaFX编译器项目,目前已经开放源代码。
x"^u?c0RZ9GQ0详细情况请访问:https://openjfx-compiler.dev.java.net/
-g~ _ B
~C
^0
R"F(BfxpKG0开发中遇到的问题ITPUB个人空间wnbkOgM#Gi
ITPUB个人空间+J`wk*M4q,j'B
JavaFX中有哪些固有的数据类型?
v|H*mh
I;T0ITPUB个人空间
v uM8EV8a8O1Q
JavaFX中的固有数据类型:String、Boolean、Number、Integer。
U j[\ZB"s0
2wvo(n;^r0JavaFX与Java类型之间的对应关系:
(Vs&gl6t0
xr#]Jp9Dk6|%u0更多信息请访问:
5{)Q D4wwg[1p&vK0https://openjfx.dev.java.net/JavaFX_Programming_Language.html#basic_typesITPUB个人空间O1aL8{
WkN$p/dP
ITPUB个人空间&z|,h Xp
如何连接两个字符串?“+”操作符已经不起作用了!?ITPUB个人空间v%Q.b$I^ao
ITPUB个人空间(k?6s.K0YR5BF;m
e
与Java有所不同,JavaFX并没有重载“+”操作符来使其用于字符串连接:ITPUB个人空间g+`gHs A]9x1Ji1i
import javafx.ui.*;import javafx.ui.canvas.*; Frame. { content: Label { text: "Hello " + "World" } visible: true}ITPUB个人空间9|1N`,jm&I
如果尝试运行上面的代码,我们将看到以下的控制台输出:ITPUB个人空间3wZ;X*^'c*k,GL%I
compile thread: Thread[AWT-EventQueue-0,6,main]compile 2.031file:/C:/workspace/F3/HelloWorld.fx:6: incompatible types: expected Number, found String in "Hello "file:/C:/workspace/F3/HelloWorld.fx:6: incompatible types: expected Number, found String in "World"file:/C:/workspace/F3/HelloWorld.fx:6: incompatible types: expected String, found Number in text: "Hello " + "World"ITPUB个人空间{4{&G