.NEt专家博客!

【jxh118】JavaFX知多少

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

常见问题
O|rO PU0ITPUB个人空间]WZ`#}6N;zD:N
JavaFX是什么?
_,KXGKoN0

)d,}[kW8c`^7Y0“JavaFX 脚本是一种声明式、静态类型编程语言。它具有一等函数(first-class functions)、声明式的语法、列表推导(list-comprehensions)及基于依赖关系的增量式求值(incremental dependency-based evaluation)等特征。”JavaFX脚本为多种多样的操作提供了声明式、无中间程序逻辑的语法,这些操作包括创建2D动画、设置属性或者声明在模式和视图对象之间的绑定依赖关系。
.S)^ a ]RF0
5TB],[ |!L3y'[0什么样的函数能够称为“first-class functions”?
)q1Pxx\l?0
7C,Q|_*M q'A0在编程语言中,我们常常把那些将函数作为一等对象的函数称为一等函数(first-class functions)。具体地说,就是编程语言支持在程序执行过程中构造新的函数,并将它们存储在数据结构中作为其它函数的参数的传入参数,并在函数返回时将它们作为函数值返回。本概念并不涵盖任何语言和程序的外部函数或者程序,例如通过调用编译器或者一个eval函数来创建新函数。
f;b-q@x0这里提供一等函数的一个简单示例:map或者mapcar函数,它使用一个函数和一个列表作为参数,然后将通过将函数应用到列表中的每个成员后形成的列表作为返回值。
%q!~i\0nF4a0
-jV+j,V%He'_0“declarative syntax”是什么意思?ITPUB个人空间U.G%|W8om5Y9f

A_(zyY2s0与大多数依靠程序和显式代码来更新在变量或者属性之间关系的编程语言不同,声明式语言允许数值被声明为另一种方式。ITPUB个人空间 hwh_%~Qz/~sH
在JavaFX的一个示例:
D7X6C^_-I0var a : Number = bind model.attrib/2;ITPUB个人空间;Z:}-dInTQR
无论何时model.attrib的数值发生改变,a的数值都将自动、透明地更新,更新期间无需调用任何程序。这对于在模式和视图对象之间绑定依赖关系、控制GUI行为是特别有用的。
N&[t6tJ2u0ITPUB个人空间ZnK{.i"^pR
“list-comprehensions”是什么意思?ITPUB个人空间ce @(}:hoaW

P!M#FT lvNZ y0我们常常把“list-comprehensions”翻译为“列表推导”。列表推导是在语言级别上支持以多种方式创建、维护列表的方法。ITPUB个人空间 ^0I2M#b8GG
在JavaFX中的一些示例:
2ERI4N\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;
j)i+HUu[0C0ITPUB个人空间(n/ox ??o/Z)p
什么是"incremental dependency-based evaluation"?ITPUB个人空间Ap/p(tD y
ITPUB个人空间#W }:c mv7v+@
“incremental dependency-based evaluation”译为“基于依赖关系的增量式求值”。在JavaFX中,属性值能够被声明为依赖于(绑定到)包含其它属性的表达式。这样,当某个被引用的属性数值发生变化时,所有依赖此属性的属性都将直接或者间接地改变它们的数值,此过程无需调用任何的中间程序逻辑。这和在Excel之类的电子表格中使用方程式很类似。ITPUB个人空间b5W'~9vO!c:Z R
这对于那些需要动态维护模式和视图属性,而又时常需要复杂的程序逻辑的GUI开发来说非常有用。ITPUB个人空间S.Yv%B.wB ?z6s

-YUZo$Tdg2e9v0“操作(operation)” vs “函数(function)”ITPUB个人空间&Ldi/Rj)Vv(c5wX

E1R/bN[O8Q3b0函数与操作之间的不同之处是函数可以递增地反复求值、可以绑定返回值、绑定参数、绑定变量/属性,隐性绑定本地变量。ITPUB个人空间S;Tp3j%n3y
为了进一步说明,请看下面的JavaFX代码片段:ITPUB个人空间8qi[,^KVo
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个人空间v;|CG3fP
我们非常清楚地看到:无论zing和zap如何变化,snap将不会发生变化。而dyn则会随着zing和zap的变化而改变。因为在zing和zap的数值发生变化时,发生了一个增量式的求值过程:程序将变化的数值传递给依赖其的所有函数,并重新计算数值。ITPUB个人空间1Mg1W;[N$pc3V
ITPUB个人空间%M5@:D}*e^ R
JavaFX的授权模式是怎么的?ITPUB个人空间 }.['_P3{3B Y6I n
ITPUB个人空间s|c[{U(AV"b*~
JavaFX 的开发者很赞同让用户发布自己的应用,并坚信开源和社区的力量。但当前的JavaFX版本是在评估授权下发布的,因此并不能够被重新发布。你当然能够发布自己编写的基于JavaFX的应用,但不能够和JavaFX一起捆绑发布,并需要告之使用者:需要到openjfx项目站点下载JavaFX二进制代码库。并且,由于正处于早期的JavaFX代码还处在评估授权下,因此它不能用于商业用途。当Sun完成了JavaFX的商业化版本开发后,我相信这将会得到改变。
q7n*C2c"^8g6t0ITPUB个人空间"m-ge ReX}
Sun是否规定了发布JavaFX商业化产品的时间线?
fzu+c Jr TWsmW0ITPUB个人空间cH Ol~M+kuVH
很抱歉,目前没有准确的时间约定,不过马上就会制定出来。ITPUB个人空间 CYSYJ,}/k2K(Rk
ITPUB个人空间z5nxT A
JavaFX Runtime像JavaFX Script那样开源吗?ITPUB个人空间ibc1@g
ITPUB个人空间N DM*p{,T4WF
是的,JavaFX Runtime即将开放源代码。ITPUB个人空间&i[ev&bW3|.R p
ITPUB个人空间} }9Z#b#a QwfR@A+^
在JavaFX和…之间的不同ITPUB个人空间x V(~6FK]
ITPUB个人空间x9X&Vc)muT
与F3比较:F3是Form. Follows Function的缩写,这是JavaFX平台从前的名字。ITPUB个人空间]+Tjo{5S]O
ITPUB个人空间'e"M {.O*V%MC:l2g-@
Java比较:JavaFX 是一种兼容JSR-223的脚本语言。它能够使用Java类,并从Java类中被调用。
N6`g/Z)c e0KK0
d C:BA._ZIu0与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)下执行。
+m'p4x'ejk:]9v0ITPUB个人空间`.Xq~CC
与SVG比较:SVG并不是一种程序语言;它是一种数据描述语言。其XML语法对于编程语言来讲是非常可怕的。但SVG的交互性、兼容性是令人满意的。目前 JavaFX开发团队并没有计划直接使用SVG。由于SVG和JavaFX都源自旧的PostScript和Java2D向量图形模式,因此在某种程度上,我们已经在JavaFX中使用了SVG,但目前仍然存在某些值得注意的不兼容性。
:w9H_Jit H0Chris Oliver 已经编写了SVG-to-F3 转换程序。ITPUB个人空间pm I*K`Q;p
ITPUB个人空间3K[-V,B(k8F:SE
与Swing比较:JavaFX是一种编写Swing应用的新方式,它无需了解swing框架和java语言。ITPUB个人空间(P PmQ"i5f0o
ITPUB个人空间t!T0~9Nnx |:eI
与JavaScript比较:在JavaFX和JavaScript之间唯一相同点就是它们都是兼容JSR-223的脚本语言。
k]Gh9E$X0ITPUB个人空间_+v:R+y.A9o7@e-Q
与Ajax比较:Ajax是使用了JavaScript和异步更新的web浏览器端技术。它与JavaFX的关系:两者都是UI相关的技术。但它们在语言和环境上完全不同。
:axyx%c.y$u.C-N'F7x:z0ITPUB个人空间 kr)f w5f
与Savaje OS的关系:Sun正在计划使用它们购买的Saveje手机系统和JVM来发布JavaFX Mobile,后者能在移动设备上运行JavaFX脚本,它将成为Windows Mobile、Flash Lite的有力竞争者。ITPUB个人空间vL6skr3Fv1x.x

]m_gZ0o8IT f8F0我能够使用JavaFX编写Java3D应用吗?它兼容VRML或者X3D标准、Xj3D之类的代码库吗?ITPUB个人空间|U o:k&}a$A1c ?
ITPUB个人空间t'j H aX
没有原因不能使用。JavaFX能够和任何第三方代码库互操作,并且不需要任何特殊语法。目前JavaFX开发团队正在进行开发支持Java3D的功能。
o] W3T]tj+Q0ITPUB个人空间.{]Djfl:XT
JavaFX是一种RCP(Rich Client Platform) 吗?
u\;A%i"Rxir(k C0
0~o1k.AA:pcar0p(S0是的。JavaFX不仅能够用于RCP开发,也能够用于RIA(Rich internet Applications)开发。ITPUB个人空间*JfM8NOy eC

\1q5kn(Ug M0我能够在web应用中使用JavaFX吗?
m3TX+U`VL%c0
,w}A3`u;~]*t0JavaFX能够用于编写前端应用、web应用的视图或者用户接口,不过这都需要JVM的支持。
5G&hq c EC0
$u3~Y+J'RE5x0A'P0V0H0JavaFX将代替Java EE中的JSF和JSP吗?ITPUB个人空间N v1u.Oom

n3Q)[T%B5` G5h0不, JSF和JSP用于编写纯粹的web应用(对于支持HTML的HTTP客户端来讲是可用的),而JavaFX需要位于客户端的JVM。如果你希望编写富客户端的话,那么就需要在客户端安装JRE,JavaFX能够提供与基于Flash的Flex、基于.net的Silverlight相同的功能。常见的应用场景是开发运行在公司内网的应用。ITPUB个人空间R)L+j"Qj }?i J

Ed olq%tH S&q;q0
JavaFX在运行时需要服务器吗?ITPUB个人空间&d&Q"M _3a%Y&CkN[
ITPUB个人空间DV.]*r-i2t W
JavaFX是一种关注GUI的脚本语言;它主要用于桌面应用,因此不需服务器。如果你计划部署JNLP(Java Web Start)的话,那么你需要一台web服务器。ITPUB个人空间+]-ekffZ0Hi

&rWCh?jnRR0运行JavaFX需要什么条件?
!XT*b|zk0
\9O9~)cP1PR(w0两种条件任选其一:
+r8{!eM\} A0~`0Java5以上、一个兼容JSR-223的实现、JavaFX代码库;ITPUB个人空间SNO:Z;k7r h;Kd
Java6以上、JavaFX代码库。
*L/dOt [']0ITPUB个人空间 he{Rt
目前有JavaFX可用的编译器吗?ITPUB个人空间5Zoo:n P"H#n(]x
ITPUB个人空间 V T!E3L'O^&x4@(L:d
OpenFX Compiler是JavaFX编译器项目,目前已经开放源代码。ITPUB个人空间*x8n/O/o)N@r!q
详细情况请访问:https://openjfx-compiler.dev.java.net/ITPUB个人空间,N8X,z;tN;Y]f E
ITPUB个人空间UV SN+u%t
开发中遇到的问题
,G;t:^8~O-sjw0
kCkd8Q([0JavaFX中有哪些固有的数据类型?
*^(|*]8cS7\p@B0
2fZ*?z%K3ShR2fH:|O0JavaFX中的固有数据类型:String、Boolean、Number、Integer。ITPUB个人空间Fh;BCoI'o1k

"kS ](s.J*W0JavaFX与Java类型之间的对应关系:ITPUB个人空间 zy#A|/U%jjT
ITPUB个人空间aO!K6}vt
更多信息请访问:ITPUB个人空间wwGg-dMZ$E5_4^
https://openjfx.dev.java.net/JavaFX_Programming_Language.html#basic_types
xB"A |^T0
ITPUB个人空间}P$J9uDf fcdpJ v
如何连接两个字符串?“+”操作符已经不起作用了!?
sf)WT.~+}0ITPUB个人空间P3G5|vH9P
与Java有所不同,JavaFX并没有重载“+”操作符来使其用于字符串连接:
@C Z-_(e(_0import javafx.ui.*;import javafx.ui.canvas.*; Frame. { content: Label { text: "Hello " + "World" } visible: true}ITPUB个人空间:j0E1C;sG0?t t
如果尝试运行上面的代码,我们将看到以下的控制台输出:
M4e J ?2biLyv0compile 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个人空间B d/B-h:U

M/Eht*ntM0O7B0实现方式之一:修改代码ITPUB个人空间R/i*PS3ol

k:JjP!I L ^#R0Java实现方法:
f}+JoS.D0String s = "Your score is " + n + " out of " + total + ".";ITPUB个人空间?9MY _4?6]
JavaFX的字符串表达式操作符{}实现连接字符串的功能:
)Y"^0`,j%z#}}U0var s:String = "Your score is {n} out of {total}.";
/j8v%hi%Vp0m ENUg0ITPUB个人空间V)U(Rx7e4VC.WD
实现方式之二:调用concat()方法ITPUB个人空间;TIW6o~s.U0Sk-h

i3k3?#U_4o0JavaFX提供了concat()方法来连接两个字符串:ITPUB个人空间b Z/D}Sa@(o-X;Z
import javafx.ui.*;import javafx.ui.canvas.*; Frame. { content: Label { text: "Hello ".concat("World") } visible: true}
[pqT5DF"S#`0
R7J~3u-i V ?"c0如何将字符串转换为数字?ITPUB个人空间%M&_%]!h+r4k
ITPUB个人空间DH}Q7^0}
目前没有直接的方式,但可以使用下面的代码:ITPUB个人空间 F*}-h)vm;f J
var value = new DecimalFormat("0").parse(someString);
W5[ | kk0
;~n-{ R0Y)M-O0如何将TextField的数值绑定到一个数字类型属性?
}%Kj}2X&R4w R0
9Ev*bC {0使用绑定::ITPUB个人空间@"_(qJ-^M
var total = 10TextField { value: bind total ...}
Xr1J6}Zq0也可以使用format进行格式化:
%T6km!q CC6L0value: bind "{total format as <<#,##0>>}"
W&S b?0aw't }0ITPUB个人空间 o iOf2H(w P @
如何设置用在Java Web Start上的JavaFX?ITPUB个人空间x!Y&z5O6gB

5gs s9|q%IiG0JNLP (Java Network Launch Protocol)是一种基于XML的协议,它能够在网络上部署Java和JavaFX应用。ITPUB个人空间6Sz wp-X4jG
这里提供一个用于部署JavaFXPad的JNLP示例。
(D&CZG Z d%f h+VZ0详细示例请见:http://download.java.net/general/openjfx/demos/javafxpad.jnlp) 。ITPUB个人空间slHo"v+X3L
<?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>ITPUB个人空间Vt't:nj!X\
ITPUB个人空间}.G6nU-@2DT9^V
“Hello Web Start FX”示例
y6V!_.^8yYO;L ~4]i%A4Y0
!O9|#QU3f.eJL0环境需求ITPUB个人空间bLJ"mxxgt5B
• Java 5 JDK
hS$xk^Yf0• 从openjfx项目下载后获得的JavaFX代码包中提取出来的/lib/javafxrt.jar and lib/swing-layout.jar
@4~-~Eae4m#a0ITPUB个人空间?2`0\e?+]
“Hello Web Start JFX”程序代码ITPUB个人空间1jXi0^QU/O

&f Nc*j&eK1\4X:b0文件名: HelloWebStart.fx
q6f*beVO `[ V/yB9B-x0import 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}
],~"WCE)fy^0ITPUB个人空间N.]4o Ix
创建 HelloWebStartJFX.jarITPUB个人空间6t[(Hl;XkN
ITPUB个人空间,[orS.t)V$tP-a
jar cvf HelloWebStartJFX.jar HelloWebStart.fx
Q2F0p'a5n0
T5O-m'Q8dO*_0创建 HelloWebStartJFX.jnlp
Sc w'ghf0ITPUB个人空间1G2Z4P1FW9s,\U2U*{
文件名: HelloWebStartJFX.jnlpITPUB个人空间'`ms0@J$? r
<?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>ITPUB个人空间;wP&UcKae*PTw
ITPUB个人空间 i#@-g"V O?!f
创建签名密钥
#r:U)t[#A8q \t'R0ITPUB个人空间#z,sJ*oj+@A
keytool -genkey -alias jfx -dname "CN=John Doe, O=JFX Inc." -validity 9999 -keystore jfx.keystore -keypass keyPassword -storepass storePassword
o V2z{[,H'KQ0ITPUB个人空间c }S)P.o&jJ@~,d
对jar文件进行签名
}t#cl J0ITPUB个人空间 q4` b@P6d X&]
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
q i2zh-Ww`0
2`de7ZL'I,LTJ}0连接到HelloWebStartJFX.jnlpITPUB个人空间 [3d5lG3nL

rlyG9e `^B0文件名: index.htmlITPUB个人空间 \ J ? PQe0]e+GE
<!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>
x"LF&W:UB7u!i&[)xq_0
)mE jm`O#t0Web服务器: 设置用于.jnlp 的MIME类型ITPUB个人空间!BEX!{2z dVJhQ

Y8T1T Yr \#p0Apache服务器:在http.conf 或者 .htaccess文件中添加类型:
E#WLN_ Y'^0application/x-java-jnlp-file JNLP
7mJloD;U0ITPUB个人空间`u)~&A&RbI
将文件复制到Web服务器
Wa,Peh0mkdir /www/www.example.com/docs/HelloWebStartJFX/cp index.html HelloWebStartJFX.jnlp HelloWebStartJFX.jar javafxrt.jar swing-layout.jar /www/www.example.com/docs/HelloWebStartJFX/
%O*KM"U*D0ITPUB个人空间;^Sz wX
启动Web StartITPUB个人空间 j8jk f$z8^EbD

kR O3P MK!J{t)R0通过www.example.com/HelloWebStartJFX/启动web Start。
V[3u mf+t-Z0ITPUB个人空间:]HUt;P
如何使用“全限定名”引用Java类?ITPUB个人空间u*Y ]5z*qv6w
ITPUB个人空间.nP#D2c3F%Y/K
全限定Java类名必须使用法语引号<< >>进行修饰。ITPUB个人空间:FlYI ])C*{ I5m
ITPUB个人空间gGEE,~ g2JL&| \
如何访问内部类和接口?ITPUB个人空间J+Yt\$FI gz
ITPUB个人空间6l7IF&AX a
在访问内部类和接口时,你只能使用内部类的编译名。
@_M#\%\)Bm0例如:
)Hv~%A F/V#{,E0在Java中的import java.util.Map.Entry,在JavaFX中将表示为import java.util.Map$Entry。
4D9_$O1nK5nC0ITPUB个人空间8s.oi~(B{
在JavaFX中还需要注意的是在引用内部类时,你需要继续使用Outer$Inner 这种形式的语法。为了方便使用,你也可以相应地将导入语句修改为:
L)il+|}:_0import java.util.Map$Entry as Entry
&VE\o]sPq u]0这样就不必重复地使用Outer$Inner形式了。
6k}rP1^P-A2d?0我能够使用Java 5的枚举(enumerations)吗?
$k#Kc_4cz5V-Uk0当然可以。你可以采用下面的方式引用它们:ITPUB个人空间)j\M5n0{
import java.util.management.MemoryType; // 导入枚举 var value = HEAP:MemoryType; // 使用枚举值 // HEAP是MemoryType中的枚举值 var allValues = MemoryType.values(); // 创建包含所有枚举值的JavaFX数组
0t%ylA"{4@{0ITPUB个人空间W%MHDbG&_$v
如何在JavaFX中轻松定制Swing组件?
*c9Y wF1gL#u0
e7N^"xB0这里提供了一些对Swing组件进行快速封装的代码,它能用于JavaFX组件层中:
vLC_S4jTdA0
X KZ;Zo9G!t[0SwingWidget类定义:
l.z!q;shU4d%? s0ITPUB个人空间%{;r&yu*Q
文件名:SwingWidget.fx
#y1T-W*s8C/h'v.PWd@0package 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;}ITPUB个人空间$U)_C:GD sK{rO

eY2b6Fb%{6l,g0用法:
D(Xq gX0F.c r0ITPUB个人空间(O wP'Eaa
下面提供了一个使用SwingWidget的简单示例。请注意在树形列表中提供的数据来自于默认的树形模型,而不是JavaFX所特有的。ITPUB个人空间Pw2[st-G8n(C
文件名:WidgetTest.fx
5b!? @3[l"q0package 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"}ITPUB个人空间*NOb}0v z2?4b
运行界面:ITPUB个人空间/]NRa!f9W(]v
ITPUB个人空间ln z6D7j@ N
ITPUB个人空间-MuA}5P j&yI @
为什么我的某些.fx文件不能被JavaFX Pad重新装载?
m Nl,fQ0
/e~6sYt{w9E0非常抱歉地告诉你,JavaFXPad目前的功能非常有限。他并不能检测到外部文件的改变。为了让它能够“看到”你的修改,你需要以手工的方式在JavaFXPad中重新打开修改后的文件。
y1Q$ss;M0ITPUB个人空间zN7ncL*^ \
如何引用其它JavaFX文件?ITPUB个人空间-y$p2BX2m N @

wC2Lg G#p7B^0JavaFX能够从以下三种资源中引用静态值、变量和类:
A~!Zp.?qV01.在同一文件内ITPUB个人空间JY}v D-kW~
2.在相同的目录/包路径下的文件ITPUB个人空间Y1aT)TB
3.在其它的包路径下的文件ITPUB个人空间0rD3Q di ~4`P
ITPUB个人空间fKc"V6qPw
首先,第一种方式非常简单。如果你正在引用处于相同文件中的类,那么你只需要使用类名即可(类可以被定义在引用之前或者之后)。而变量则要在它们被声明之后才能被引用。
q0`+?9K.z"k/iu0ITPUB个人空间8HO1X;M&Cs,t
对于第二种方式,显而易见,你无须对处于相同包路径下的每个.fx文件都使用import语句,而只要提供具有它们所在的同一包路径的import语句即可。
P@MM)j|4o$q0
j V*et2u-N0如果你有其它的内部类或者你需要从不同的包路径下引入类,那么就需要使用import语句完成一点额外工作:使用import语句将.fx文件导入,而不是在此文件中的某个特定的类。例如,如果MediaTable.fx包含两个类:MediaTableColumn和MediaTableRow,那么你只需要importing MediaTable这一条语句就可以导入这两个类。ITPUB个人空间$TlGwC9d%\ a"D

6| H%bZYM0你也可以像使用Java一样使用 import *语句。但由于这种方式降低了代码的可读性,所以并不推荐给大家。ITPUB个人空间"GB5[ p yE{ M

v*Rdt4v,S/s1s(h_0JavaFX脚本提供类似 __LINE__这样的魔术常量(magic constants)吗?
%Zblz!CtR0ITPUB个人空间-Q/J5A:o8Y&A4N&_
魔术常量
M2G9cU\m`0
Zl[$bq"bb{_0• __DIR__ -- 返回包含当前FX源文件的目录的URL。如果当前文件是从jar文件装载的,那么返回值可能是jar文件的URL。ITPUB个人空间Vf f l0`;c p K
• __FILE__ -- 返回当前源文件的URL。
P)_\^1y&E5h0• __LINE__ -- 返回当前源文件中的当前行。
'QN Q)CbN4E \/s0• __ARCHIVE__ -- 返回包含当前文件的jar文件的URL。ITPUB个人空间C m\*xQ g1m5v-c
ITPUB个人空间Z8Z l/^\7GJ
示例ITPUB个人空间L-L OM8z ?U6J&p
ITPUB个人空间1X`'l${\
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.ITPUB个人空间4Q)vqbz;s4W

4O:q&PHYE:r S7a0更多信息
^:ZKm1gP;o t_s0
,O%Ag|ut7Q l0• Christopher Oliver编写的"Magic Constants"
s*Oycq9f[0
F$O9fB(_%]F9\0JavaFX中的保留字有哪些?
F!T0C.?Rw0
Dyz Z(w,HR#\0after
Y [h A'@Fv0andITPUB个人空间X:B Tpl/? {:BN
asITPUB个人空间!y,ZCe/jK
assertITPUB个人空间-NXn:pqxt
attribute
Mw,N&?(OK@0beforeITPUB个人空间^$~jN.\7[1T
bindITPUB个人空间Hk V;XTj:bso
breakITPUB个人空间;HZZ3m,mx4\6~B
by
u-DgiF9k:C`0catch
keP+r5p-]+W XNk0class
6IFupU[@.d0continueITPUB个人空间ir|){(GSpex
delete
I2e#~i\3F5eq}0distinct
)c&]%ge kq CT0doITPUB个人空间M$rf.T!@%C;h9Q
durITPUB个人空间.Pc;xWM,Y1Sepzb
easebothITPUB个人空间b8@\X"L
easein
3k0b p0k-T6\aH9I0easeout
X'WUhm@0else
!]`'?&Cv;g?1@7q*Lz0endifITPUB个人空间#^!O1W#hZ$t"O`
extendsITPUB个人空间*@2}/P5D` Oyx6{0bZ
false
,f8@&dY9vEtX0finallyITPUB个人空间$}!Qf oH'c
firstITPUB个人空间tOH0ni.VE;O
forITPUB个人空间4k$[)z5H8a"Ds5H
foreachITPUB个人空间#]dh;x g&c~UQ
format
t#ybGszp2\B0fpsITPUB个人空间1T!Yzd ^vQ%| TZg
fromITPUB个人空间-rr)b{'e
function
s5gu6Iv w A0if
d@2wQ~B~:P'QH/L0import
esZr R%I ts_]0inITPUB个人空间7]W F_Q'Mn
index
Yx#H/]s/K1_/S0indexof
-Fk:uM;c;QCobq_!?0insert
9nW&D*H~ D f0r0instanceof
!h![u:xn9B0intoITPUB个人空间*o:rWW:}0nC-[.M
inverseITPUB个人空间ncNJfa2};Jd{/i
last
J W;Y1K0IO6vM0laterITPUB个人空间yt/kz7S
lazyITPUB个人空间/U9IV(S;k ixk*_!G k
linearITPUB个人空间h G{7ux
motionITPUB个人空间%^d0|:^ J/z%L
nodebugITPUB个人空间@9Lzdz
new
Q(`&dkb\'\0notITPUB个人空间wQel&x$?*|H N
nullITPUB个人空间 g@-uZd~
onITPUB个人空间2Px;]4uAK:ubb%j
operation
Uv#C.B;\3}U0orITPUB个人空间z;HyJ*i({ ld
order
iS${5g4G%N0package
ki ^3e~\t#[0private
Qs.J+vE+kv0protected
W#i"R mBKG0publicITPUB个人空间:dv,h-gS!m
readonly
f"[|Z/n0return
IK7w;~r0reverseITPUB个人空间^f&V7m#j/a7H5l
select
#v U0n0H VT |3O,]t0sizeof
XX,\ S+^yN0super
Ud0~)[ G2A1J&XN0thenITPUB个人空间n@kv T#dw
thisITPUB个人空间Z9V~/k3BN-]z
throw (请注意不是throws)
A \ M$a!{-pW|#I1n0triggerITPUB个人空间J ~)r j;J,|x
trueITPUB个人空间 uI3am~.v+VGn
try
&M2y5K L!L0typeof
lYF/Q3A4p.w0unitinterval
#|!b/YmA |dhJQ5nf0valueofITPUB个人空间7c k5Efy"_g-P
var
&u'~'^~BaE9?L0where
/bdE8i,a/fH@l+e0whileITPUB个人空间mZbm7a2L)dh
xor


TAG:

 

评分:0

我来说两句

显示全部

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

Open Toolbar