.NEt专家博客!

【jxh118】JavaFX知多少

上一篇 / 下一篇  2008-06-06 11:07:16

常见问题
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;xz b1N ? X
什么样的函数能够称为“first-class functions”?ITPUB个人空间0x*r4S6H H c@h

5u3AE6z,M`M"x0在编程语言中,我们常常把那些将函数作为一等对象的函数称为一等函数(first-class functions)。具体地说,就是编程语言支持在程序执行过程中构造新的函数,并将它们存储在数据结构中作为其它函数的参数的传入参数,并在函数返回时将它们作为函数值返回。本概念并不涵盖任何语言和程序的外部函数或者程序,例如通过调用编译器或者一个eval函数来创建新函数。ITPUB个人空间 TF;guM+w
这里提供一等函数的一个简单示例:map或者mapcar函数,它使用一个函数和一个列表作为参数,然后将通过将函数应用到列表中的每个成员后形成的列表作为返回值。
0pj r?Q*CT K0ITPUB个人空间+drWN:{pb
“declarative syntax”是什么意思?
d:p#AT#h\!c0
J"}+oO%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 F LC J2r`jC0我们常常把“list-comprehensions”翻译为“列表推导”。列表推导是在语言级别上支持以多种方式创建、维护列表的方法。
]R)jhk}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.BO hN0

gmt n'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个人空间Q v!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个人空间F r{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个人空间MO O,V"GM
Sun是否规定了发布JavaFX商业化产品的时间线?
6L5\ c)@\Q)zN0
f.J!t%e5Sg0很抱歉,目前没有准确的时间约定,不过马上就会制定出来。ITPUB个人空间 TiRm euZ
ITPUB个人空间1hZ#wX Dv*n
JavaFX Runtime像JavaFX Script那样开源吗?ITPUB个人空间%V5G+l sT

U6upi-UX+L0是的,JavaFX Runtime即将开放源代码。
H!v LX6yR!gk0
6q [ C9nZ N3W~,}0在JavaFX和…之间的不同ITPUB个人空间T'iT:n N)Z.m
ITPUB个人空间|hVhG6HH
与F3比较:F3是Form. Follows Function的缩写,这是JavaFX平台从前的名字。ITPUB个人空间 z5C&yf ff6R:[}

2G i.|(o;|(wt^w0Java比较: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&C U X0与SVG比较:SVG并不是一种程序语言;它是一种数据描述语言。其XML语法对于编程语言来讲是非常可怕的。但SVG的交互性、兼容性是令人满意的。目前 JavaFX开发团队并没有计划直接使用SVG。由于SVG和JavaFX都源自旧的PostScript和Java2D向量图形模式,因此在某种程度上,我们已经在JavaFX中使用了SVG,但目前仍然存在某些值得注意的不兼容性。ITPUB个人空间%{KQ-~K;Y)ia c8v7Of
Chris Oliver 已经编写了SVG-to-F3 转换程序。
Z aU/^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个人空间/[:yg*jorv&IE5B

] q[}/r;d"p.eK0与Savaje OS的关系:Sun正在计划使用它们购买的Saveje手机系统和JVM来发布JavaFX Mobile,后者能在移动设备上运行JavaFX脚本,它将成为Windows Mobile、Flash Lite的有力竞争者。ITPUB个人空间.Mq gP%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,pA BK4P0
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,CMnQl

"F)x |X F4|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个人空间2lA I2z%hoFPts
JavaFX在运行时需要服务器吗?ITPUB个人空间U0Y#\ z@ I z0Rz I

{B\6I q9n?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个人空间 vuM8EV8a8O1Q
JavaFX中的固有数据类型:String、Boolean、Number、Integer。
U j[\ZB"s0
2w vo(n;^r0JavaFX与Java类型之间的对应关系:
(Vs&gl6t0
x r#]Jp9Dk6|%u0
更多信息请访问:
5{)Q D4ww g[1p&vK0
https://openjfx.dev.java.net/JavaFX_Programming_Language.html#basic_typesITPUB个人空间O1aL8{ WkN$p/dP
ITPUB个人空间&z|,hXp
如何连接两个字符串?“+”操作符已经不起作用了!?ITPUB个人空间v%Q.b$I^ao
ITPUB个人空间(k?6s.K0YR5BF;m e
与Java有所不同,JavaFX并没有重载“+”操作符来使其用于字符串连接:ITPUB个人空间g+`gHs A]9x1J i1i
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{&Gj w~X
ITPUB个人空间+nhc3DYF-w#Sz
实现方式之一:修改代码
/t(Hq\$H#i fhDU0ITPUB个人空间P3cb]M5g+ltr u
Java实现方法:ITPUB个人空间Y1HHr"i@%z3GU]
String s = "Your score is " + n + " out of " + total + ".";
)q1CD2G2@s6S!cUS4x0JavaFX的字符串表达式操作符{}实现连接字符串的功能:
/g$_3pdC8aZZSF0var s:String = "Your score is {n} out of {total}.";
p7} NG#F&a%rI0
$\L%o+h6v0Fi'of PnR0实现方式之二:调用concat()方法ITPUB个人空间,W#@qt/f*@+NV*\y/I
ITPUB个人空间Pe1a9]3Qf1Ab2nX\
JavaFX提供了concat()方法来连接两个字符串:
` q"emFe;[3c0import javafx.ui.*;import javafx.ui.canvas.*; Frame. { content: Label { text: "Hello ".concat("World") } visible: true}
|?]L1r @Y"UI U:t-N0ITPUB个人空间fAsW'PBE6R
如何将字符串转换为数字?ITPUB个人空间u [8y!{I"H0P A-xTB
ITPUB个人空间U]5`$dj{
目前没有直接的方式,但可以使用下面的代码:
O"n$mV&P0var value = new DecimalFormat("0").parse(someString);ITPUB个人空间EU}3ROM
ITPUB个人空间5^Jj v ST8jmn8L)v
如何将TextField的数值绑定到一个数字类型属性?
#Q%[5MQ:f\2k0ITPUB个人空间Ia3K7m5G
使用绑定::ITPUB个人空间8j0D+{i!b6W mI Z-B
var total = 10TextField { value: bind total ...}ITPUB个人空间7T$X[7U ^d
也可以使用format进行格式化:
ZS7jBs8uE?J0value: bind "{total format as <<#,##0>>}"
MVZ ^ A W C8N0
W)[6Ji*FesA0如何设置用在Java Web Start上的JavaFX?ITPUB个人空间7GN5x"l `a!oM

Ec#_9W,?5NT.k-Q:b0JNLP (Java Network Launch Protocol)是一种基于XML的协议,它能够在网络上部署Java和JavaFX应用。
JnH)T0G ^#Yo0这里提供一个用于部署JavaFXPad的JNLP示例。
)];w5VSI#^c4k]l0详细示例请见:http://download.java.net/general/openjfx/demos/javafxpad.jnlp) 。ITPUB个人空间0Mgf([B_ z
<?xml version="1.0" encoding="utf-8"?><jnlp spec="1.5+" codebase="http://download.java.net/general/openjfx/demos" href="javafxpad.jnlp"> <information> <title>JavaFX Demos:JavaFX Pad</title> <vendor>Sun Microsystems</vendor> <offline-allowed /> </information> <security> <all-permissions/> </security> <resources> <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se" java-vm-args="-Xss1M -Xmx256M" > </j2se> <jar href="javafxrt.jar" main="true"/> <jar href="Filters.jar"/> <jar href="swing-layout.jar"/> <jar href="javafxpad.jar"/> </resources> <application-desc main-class="net.java.javafx.FXShell"> <argument>javafxpad.Main</argument> </application-desc></jnlp>
5u Ys&d:u5uR0
s6l,z^+i|h0“Hello Web Start FX”示例ITPUB个人空间ZD"h6C&m&@ Z ]
ITPUB个人空间atrhe]+K S
环境需求ITPUB个人空间mF.t!l7I
• Java 5 JDK
:Q[_/Oe/tv+dEX0• 从openjfx项目下载后获得的JavaFX代码包中提取出来的/lib/javafxrt.jar and lib/swing-layout.jarITPUB个人空间A x7f d9@G1h+I*~
ITPUB个人空间A$y^C }rF&Y
“Hello Web Start JFX”程序代码
|)HQ,mW H&f0
1N(uJ]}X0文件名: HelloWebStart.fx
NN1RD"V.u*|0import javafx.ui.*;Frame. { title : 'Hello Web Start JFX!' width : 600 height : 400 content: Label { text: 'Hello Web Start JFX!' font: Font{size: 32} } visible: true}ITPUB个人空间6Gl!g*@:O3]l

,_\Z{q0创建 HelloWebStartJFX.jar
T ^ j G:J}+G(] d0ITPUB个人空间F \ `?g _O
jar cvf HelloWebStartJFX.jar HelloWebStart.fxITPUB个人空间"PL1s;E-zW }6x

$v MU2RbUY"q8~[i b0创建 HelloWebStartJFX.jnlpITPUB个人空间m1]AKl v
ITPUB个人空间`xZxD
文件名: HelloWebStartJFX.jnlpITPUB个人空间y/S*o`3b}:O
<?xml version="1.0" encoding="utf-8"?><jnlp spec="1.5+" codebase="http://www.example.com/HelloWebStartJFX/" href="HelloWebStartJFX.jnlp"> <information> <title>Hello Web Start JFX</title> <vendor>John Doe</vendor> <homepage href="http://www.example.com/HelloWebStartJFX/"/> <description>Web Start example for JavaFX Scripts</description> <offline-allowed/> </information> <security> <all-permissions/> </security> <resources> <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"> </j2se> <jar href="javafxrt.jar" main="true"/> <jar href="swing-layout.jar"/> <jar href="HelloWebStartJFX.jar"/> </resources> <application-desc main-class="net.java.javafx.FXShell"> <argument>HelloWebStart</argument> </application-desc></jnlp>
;x5}R3DGUV0
6s1_6?zC#hf OS2M0创建签名密钥ITPUB个人空间 ~n`S*k

~ [a OU:C&Un"f0keytool -genkey -alias jfx -dname "CN=John Doe, O=JFX Inc." -validity 9999 -keystore jfx.keystore -keypass keyPassword -storepass storePasswordITPUB个人空间,jTK0Qn*r-zvc(Y7{:c
ITPUB个人空间b;H^7_N+a5rcs
对jar文件进行签名
$zE\4SYS$g'{1xFV0ITPUB个人空间%GY'tC)K&d-U
jarsigner -keystore jfx.keystore -verbose -keypass keyPassword -storepass storePassword HelloWebStartJFX.jar jfxjarsigner -keystore jfx.keystore -verbose -keypass keyPassword -storepass storePassword javafxrt.jar jfxjarsigner -keystore jfx.keystore -verbose -keypass keyPassword -storepass storePassword swing-layout.jar jfx
j6R5b!Ti_0ITPUB个人空间 K6{} pV.cQUUK
连接到HelloWebStartJFX.jnlpITPUB个人空间'D T$T Ru0Fy0E

t(au;Wu8M2c9WM0文件名: index.html
r,[B)n o}ibI0<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta. http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Hello Web Start JFX!</title> </head> <body> <h1>Hello Web Start JFX!</h1> <p><a href="HelloWebStartJFX.jnlp">Java Web Start: Hello Web Start JFX!</a></p> </body></html>ITPUB个人空间6hS5k-_t

g3L2gt/Ghv0Web服务器: 设置用于.jnlp 的MIME类型ITPUB个人空间(X9R]1DQ b8_7W

zZ+f{,MY"Gt0Apache服务器:在http.conf 或者 .htaccess文件中添加类型:
TN4i%Py\q0application/x-java-jnlp-file JNLP
5OC"W!b;bP-r/WP \7l0
eh'oe5rJ?3k,e0将文件复制到Web服务器
-p1z%_P4y5b0mkdir /www/www.example.com/docs/HelloWebStartJFX/cp index.html HelloWebStartJFX.jnlp HelloWebStartJFX.jar javafxrt.jar swing-layout.jar /www/www.example.com/docs/HelloWebStartJFX/
C$ubc~+v(d%CP7J Q0
$`9Rr5V'CI x-V0启动Web Start
lE vQ?%` j `*a0ITPUB个人空间 N"@s+rAVD-L/mc8U}
通过www.example.com/HelloWebStartJFX/启动web Start。
{[!s9TQ{5` g%C0ITPUB个人空间F-T[Y n6DJ
如何使用“全限定名”引用Java类?ITPUB个人空间 [y@&}s#V^pc

3YSD*H*qkw ZI0全限定Java类名必须使用法语引号<< >>进行修饰。
8{,[a%m9TF0ITPUB个人空间$U(c;}z%|@s|
如何访问内部类和接口?
s:` A'_H].s8@1w_x0
U2Z5A%W.LF9oW|c$w0在访问内部类和接口时,你只能使用内部类的编译名。
i!B3JC P,\ Y Vk0例如:
*b\~8G5E`0在Java中的import java.util.Map.Entry,在JavaFX中将表示为import java.util.Map$Entry。
v lZ g6?1x0ITPUB个人空间6?}v7t$T.p
在JavaFX中还需要注意的是在引用内部类时,你需要继续使用Outer$Inner 这种形式的语法。为了方便使用,你也可以相应地将导入语句修改为:ITPUB个人空间)CPI~/r%Ak4vT
import java.util.Map$Entry as Entry
o_cyh|`0这样就不必重复地使用Outer$Inner形式了。
0]w h xg!H0我能够使用Java 5的枚举(enumerations)吗?ITPUB个人空间M vy&P/~v }%?
当然可以。你可以采用下面的方式引用它们:
%H P/aS'k0import java.util.management.MemoryType; // 导入枚举 var value = HEAP:MemoryType; // 使用枚举值 // HEAP是MemoryType中的枚举值 var allValues = MemoryType.values(); // 创建包含所有枚举值的JavaFX数组
Z4M E~u0
9}0E)X x#H0如何在JavaFX中轻松定制Swing组件?ITPUB个人空间sb)P)GQl.CpR%Z
ITPUB个人空间A1ccTA;FF
这里提供了一些对Swing组件进行快速封装的代码,它能用于JavaFX组件层中:ITPUB个人空间 oO {2S(G5`i

(D;R6F-LI/S\/E0SwingWidget类定义:
A T7J$mws n-F m7y0ITPUB个人空间oID&d@2ZF3t:[g
文件名:SwingWidget.fxITPUB个人空间_ YtH_7f
package a.b.c;import javafx.ui.*;import javax.swing.JComponent;class SwingWidget extends Widget { attribute swingComponent: JComponent;}operation SwingWidget.createComponent():<<javax.swing.JComponent>> { return swingComponent;}
dNOyb`EZ0
1Opvm&oB%?4B#X0用法:ITPUB个人空间4p g:TF_4J5Y]:e'r
ITPUB个人空间I;X)Q?V
下面提供了一个使用SwingWidget的简单示例。请注意在树形列表中提供的数据来自于默认的树形模型,而不是JavaFX所特有的。
4@ \Z#A*\-bAMQ0文件名:WidgetTest.fx
@V fq/cF,Ym0package a.b.c;import javafx.ui.*;import javafx.ui.canvas.*;import java.lang.System;import javax.swing.JTree;import a.b.c.SwingWidget;Frame. { onClose: operation() { System.exit(0); } content: SwingWidget { swingComponent: new JTree() } visible: true title: "WTF, the Widget Test Framework"}
4z e@ F%I2if6N0运行界面:ITPUB个人空间)`-B5Q0Y[2\B
ITPUB个人空间\Kz'[ ] T K
ITPUB个人空间juGa)Y \*eC f
为什么我的某些.fx文件不能被JavaFX Pad重新装载?
g:J8bb]8BF0ITPUB个人空间4I#X }O-N3z
非常抱歉地告诉你,JavaFXPad目前的功能非常有限。他并不能检测到外部文件的改变。为了让它能够“看到”你的修改,你需要以手工的方式在JavaFXPad中重新打开修改后的文件。ITPUB个人空间{ztU|sJ'A

QL3V'Qc0如何引用其它JavaFX文件?ITPUB个人空间!U#mmhe_*\x
ITPUB个人空间P| {6r/Xwhx#V
JavaFX能够从以下三种资源中引用静态值、变量和类:
V Xc2ts9O01.在同一文件内ITPUB个人空间6dQP2bdG~0@.I.IO
2.在相同的目录/包路径下的文件ITPUB个人空间]4MI1m(G9kF y
3.在其它的包路径下的文件ITPUB个人空间MD pqFYR/k

2[:[ B5m'~ N0首先,第一种方式非常简单。如果你正在引用处于相同文件中的类,那么你只需要使用类名即可(类可以被定义在引用之前或者之后)。而变量则要在它们被声明之后才能被引用。ITPUB个人空间$a+nM9Ns4Aa&y

S,he9|4g}0对于第二种方式,显而易见,你无须对处于相同包路径下的每个.fx文件都使用import语句,而只要提供具有它们所在的同一包路径的import语句即可。
H&s(AP] R)t*CDS0ITPUB个人空间P1K$X0]w?b'm
如果你有其它的内部类或者你需要从不同的包路径下引入类,那么就需要使用import语句完成一点额外工作:使用import语句将.fx文件导入,而不是在此文件中的某个特定的类。例如,如果MediaTable.fx包含两个类:MediaTableColumn和MediaTableRow,那么你只需要importing MediaTable这一条语句就可以导入这两个类。ITPUB个人空间&{'L)n1sA7o$Z-[v K

$H3W9O)O-m/v Mri0你也可以像使用Java一样使用 import *语句。但由于这种方式降低了代码的可读性,所以并不推荐给大家。
.Y8V G!u-\ D@0
V o,Js&y/hDQ0JavaFX脚本提供类似 __LINE__这样的魔术常量(magic constants)吗?ITPUB个人空间$T J%O!I1``

_?vX~"fT0魔术常量
9^ x5LkPZ_0
dJ | u3u K^:E n!d0• __DIR__ -- 返回包含当前FX源文件的目录的URL。如果当前文件是从jar文件装载的,那么返回值可能是jar文件的URL。
CZq.XFy2V3V\ Z0• __FILE__ -- 返回当前源文件的URL。ITPUB个人空间 z7Pr/p(D
• __LINE__ -- 返回当前源文件中的当前行。
#CA,Aj4?n0• __ARCHIVE__ -- 返回包含当前文件的jar文件的URL。
Wd2{4iY cy S0
-m ir!W^3[1f*b,Ra0示例ITPUB个人空间-wa f8e[s
ITPUB个人空间y)it[!m]1]
import javafx.ui.*; Frame. { title : 'Magic Constants' width : 700 height : 400 content: Label {text: "<html><dl> <dt>__DOCBASE__</dt><dd>{__DOCBASE__}</dd> <dt>__DIR__</dt> <dd>{__DIR__}</dd> <dt>__FILE__</dt> <dd>{__FILE__}</dd> <dt>__LINE__</dt> <dd>{__LINE__}</dd> <dt>__ARCHIVE__</dt><dd>{__ARCHIVE__}</dd> </dl></html>"} visible: true}// Frame.
}!v6gc v6a%A0
\ Z O#IAG0更多信息ITPUB个人空间)f#bSxXLV2c

s*DH6n"w0• Christopher Oliver编写的"Magic Constants"
Yy/CX~8]/?!G(gn:z0
'`Ng)a L'k0JavaFX中的保留字有哪些?
XF!VKwGmf o]0ITPUB个人空间/F t7a!F6u[K
afterITPUB个人空间.dL1T"x*oY+H2o
andITPUB个人空间3lx~(~D2e1II2[
as
Aer HQ-a0assert
%m B*DS!HJ:N7a)IX0attributeITPUB个人空间;v6T4{W K3J)`
beforeITPUB个人空间O(RoT(B;Ur Eo
bind
/c8r z |A0K0breakITPUB个人空间T B S(p(|3W
by
2|'U T:^/Trk!Y B n;NWa0catchITPUB个人空间qv5}+eM
classITPUB个人空间)Wq^TZ(oP5?
continue
9V*e.r3Scj0deleteITPUB个人空间H)v6R7H_&EzX
distinctITPUB个人空间8h:c]Niz[[
do
(fv|6W6x8l,J/T0durITPUB个人空间-k4[#u~Pr9gi:U
easebothITPUB个人空间hFS0JtQ
easeinITPUB个人空间3F&@5h@~0B'lu
easeout
1?f!}/?GuF0else
1qC)qO;b#eu0endif
x-S^6ejEwr%x0extends
8M'e W.N!Z P3Lh0false
CR+[k/v(I8?\0finally
;jm6wB7n9j0first
(AUD9Jy/i.rH0forITPUB个人空间8K3yZ a$mEH@#S
foreachITPUB个人空间)t$t"Tx1c N5` j[O
formatITPUB个人空间l(d to.V%|tTEL
fps
@G(x0Gj;^Muv t"` I0fromITPUB个人空间 v?g[$N5U
functionITPUB个人空间Jr|_BR3O8t[
if
:X o C C;L0import
|)?WH t0inITPUB个人空间6i?-NJM
indexITPUB个人空间^#aj;_|W h-iX2T
indexofITPUB个人空间#A}VKO:s
insertITPUB个人空间OO/IPw*T
instanceof
4k0Gw/Mg$[v? vqu0intoITPUB个人空间uT/^SY
inverse
E uH4K*ak{Q LB0last
8FMq \{jW2iI L v0laterITPUB个人空间L9g5oVe%m3Bt Z
lazy
c b)W1|Aw0linearITPUB个人空间ON(Wf F e
motion
-ha|XA6G_3G4{0nodebug
yBm3l!Jh0newITPUB个人空间?)^QSV)\ ` ],v
not
b)NfK&d*V4ob0null
SDaLrF0on
T@3?[zK/Q E0operationITPUB个人空间Fg ZxbT!J5gP
or
v Z8uq[9h.hh4J0orderITPUB个人空间bqH c'zf`
package
'u n g)APC0BW2\m0privateITPUB个人空间8UpF&oa
protected
C3m3qo B/y\T r0publicITPUB个人空间l bgy4{(^CK$bgFC
readonlyITPUB个人空间'n ^ Yfu
returnITPUB个人空间cK u5mI$Dr
reverse
]mC4j?9F}qI9A0selectITPUB个人空间IY C o+mz{
sizeofITPUB个人空间Hk,rzf1U'y
superITPUB个人空间cvI/m5mo!}!aH/vQ1J
thenITPUB个人空间3{)B,k+]+t e.k#@?
this
$Oa*d$^7I$`0throw (请注意不是throws)ITPUB个人空间q?h.rC-IN2q+_&y j
trigger
H8W5K|"F"r`;r0true
/r,v5Kn1l{{7r0tryITPUB个人空间0rC.mC#Sw{m.W W
typeof
2F1Q5kA8m1y&V7x0unitinterval
P&Y a$cA.Zj5Q0valueof
`FtSi Q||6}Yj0varITPUB个人空间i:W4p.{ p^-z5Rh
whereITPUB个人空间6z5V%tt `$h f3s$Y
whileITPUB个人空间;sV uQ-B#x
xor


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar