.NEt专家博客!

【jxh118】JavaFX知多少

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

常见问题ITPUB个人空间 B'Q{1i"na%WS

3r6I7r F%h"i&y0
JavaFX是什么?
/m~g~o,^r` e9s0

0|[b6h5]0^H0“JavaFX 脚本是一种声明式、静态类型编程语言。它具有一等函数(first-class functions)、声明式的语法、列表推导(list-comprehensions)及基于依赖关系的增量式求值(incremental dependency-based evaluation)等特征。”JavaFX脚本为多种多样的操作提供了声明式、无中间程序逻辑的语法,这些操作包括创建2D动画、设置属性或者声明在模式和视图对象之间的绑定依赖关系。ITPUB个人空间'|[ a O2bG/U:X"E
ITPUB个人空间:l%^1Y@V h!F
什么样的函数能够称为“first-class functions”?
eS3fXo3n7B*z0
H8Q~v-s6@0在编程语言中,我们常常把那些将函数作为一等对象的函数称为一等函数(first-class functions)。具体地说,就是编程语言支持在程序执行过程中构造新的函数,并将它们存储在数据结构中作为其它函数的参数的传入参数,并在函数返回时将它们作为函数值返回。本概念并不涵盖任何语言和程序的外部函数或者程序,例如通过调用编译器或者一个eval函数来创建新函数。
d+J&T,Dk.n0这里提供一等函数的一个简单示例:map或者mapcar函数,它使用一个函数和一个列表作为参数,然后将通过将函数应用到列表中的每个成员后形成的列表作为返回值。
S$lS&M4b9tpR0ITPUB个人空间0sV,Y-bCJ-_Wh
“declarative syntax”是什么意思?
YH1Yo4`C3`G0ITPUB个人空间QI/c7Z8R}3jjm
与大多数依靠程序和显式代码来更新在变量或者属性之间关系的编程语言不同,声明式语言允许数值被声明为另一种方式。ITPUB个人空间~1Ve2r[a!Lb#^
在JavaFX的一个示例:
x2OFM&v0var a : Number = bind model.attrib/2;
;v9K Th$t*Vs0无论何时model.attrib的数值发生改变,a的数值都将自动、透明地更新,更新期间无需调用任何程序。这对于在模式和视图对象之间绑定依赖关系、控制GUI行为是特别有用的。
,VC!x;j r0u$JZ0ITPUB个人空间sR+v7hd5hFH
“list-comprehensions”是什么意思?ITPUB个人空间j7g uB To
ITPUB个人空间|+{ Wc`yHk;L7B)K
我们常常把“list-comprehensions”翻译为“列表推导”。列表推导是在语言级别上支持以多种方式创建、维护列表的方法。ITPUB个人空间/q5Y,a0{ ?Q^0J
在JavaFX中的一些示例:ITPUB个人空间T;r M)f-XUC
var 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;ITPUB个人空间/R*vdC eSJI~q/?

@zxoHS2M%n5l0
什么是"incremental dependency-based evaluation"?ITPUB个人空间D)kEFH5t

U&{.Mh[pc,b0“incremental dependency-based evaluation”译为“基于依赖关系的增量式求值”。在JavaFX中,属性值能够被声明为依赖于(绑定到)包含其它属性的表达式。这样,当某个被引用的属性数值发生变化时,所有依赖此属性的属性都将直接或者间接地改变它们的数值,此过程无需调用任何的中间程序逻辑。这和在Excel之类的电子表格中使用方程式很类似。
5m*Le z6F|0这对于那些需要动态维护模式和视图属性,而又时常需要复杂的程序逻辑的GUI开发来说非常有用。
6ox\0dT.`nk1]0
\ gM LR@r0“操作(operation)” vs “函数(function)”
!M9pS)d.@dNn0
js tnME0函数与操作之间的不同之处是函数可以递增地反复求值、可以绑定返回值、绑定参数、绑定变量/属性,隐性绑定本地变量。
A.}3Kq3` G-C0为了进一步说明,请看下面的JavaFX代码片段:ITPUB个人空间W+U.TlA'xQ}
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);
V?5F9LW;V0我们非常清楚地看到:无论zing和zap如何变化,snap将不会发生变化。而dyn则会随着zing和zap的变化而改变。因为在zing和zap的数值发生变化时,发生了一个增量式的求值过程:程序将变化的数值传递给依赖其的所有函数,并重新计算数值。
v4d0e*E[8p8N0
D l9D.RC&E1H!B)u0JavaFX的授权模式是怎么的?ITPUB个人空间V {%U6Qwo
ITPUB个人空间 @;d&S_$@[q H-C
JavaFX 的开发者很赞同让用户发布自己的应用,并坚信开源和社区的力量。但当前的JavaFX版本是在评估授权下发布的,因此并不能够被重新发布。你当然能够发布自己编写的基于JavaFX的应用,但不能够和JavaFX一起捆绑发布,并需要告之使用者:需要到openjfx项目站点下载JavaFX二进制代码库。并且,由于正处于早期的JavaFX代码还处在评估授权下,因此它不能用于商业用途。当Sun完成了JavaFX的商业化版本开发后,我相信这将会得到改变。
Qw)L9HH W t0ITPUB个人空间:`kP0E^K,~dvU
Sun是否规定了发布JavaFX商业化产品的时间线?
O9^ I4\i3{PN0Z0
7z'jw:B'Me|/wBg-g0很抱歉,目前没有准确的时间约定,不过马上就会制定出来。
C7E&b7[ W7l0ITPUB个人空间 n'f&O#]*z-h)PUK9c'X
JavaFX Runtime像JavaFX Script那样开源吗?ITPUB个人空间#f:\BEk]tBWO0P

U~ a9nD$y0是的,JavaFX Runtime即将开放源代码。
j/pT l"D W)B.Q0ITPUB个人空间7D&F Q Qu7I)b ~8r
在JavaFX和…之间的不同ITPUB个人空间|5L f[ wvpK
ITPUB个人空间 mH;JN3AR
与F3比较:F3是Form. Follows Function的缩写,这是JavaFX平台从前的名字。
J%| ],S)L'pM8Bp?0
x'b+i0A)s0Java比较:JavaFX 是一种兼容JSR-223的脚本语言。它能够使用Java类,并从Java类中被调用。
L:\gbC0
D Ejr0z:Dv;ri4D0与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)下执行。ITPUB个人空间6b}#vW.h{+u^T

?QwTt4Y;\0与SVG比较:SVG并不是一种程序语言;它是一种数据描述语言。其XML语法对于编程语言来讲是非常可怕的。但SVG的交互性、兼容性是令人满意的。目前 JavaFX开发团队并没有计划直接使用SVG。由于SVG和JavaFX都源自旧的PostScript和Java2D向量图形模式,因此在某种程度上,我们已经在JavaFX中使用了SVG,但目前仍然存在某些值得注意的不兼容性。
U%\Y6](VF+v"K:L0Chris Oliver 已经编写了SVG-to-F3 转换程序。ITPUB个人空间nt8rVO[2Q

T-h-Aw{Lw/vu0与Swing比较:JavaFX是一种编写Swing应用的新方式,它无需了解swing框架和java语言。ITPUB个人空间j-F,q4[AS~ _0y

$q3i1cd^9q1R0与JavaScript比较:在JavaFX和JavaScript之间唯一相同点就是它们都是兼容JSR-223的脚本语言。ITPUB个人空间Y!q+ab*v.t%^Y

PK8KLV.d0与Ajax比较:Ajax是使用了JavaScript和异步更新的web浏览器端技术。它与JavaFX的关系:两者都是UI相关的技术。但它们在语言和环境上完全不同。ITPUB个人空间%D.c;t'mwJ3K
ITPUB个人空间3H6|:o?R!t3r
与Savaje OS的关系:Sun正在计划使用它们购买的Saveje手机系统和JVM来发布JavaFX Mobile,后者能在移动设备上运行JavaFX脚本,它将成为Windows Mobile、Flash Lite的有力竞争者。
D,H5IMcw1v SB/W0ITPUB个人空间SK)b2Z8q |6B n
我能够使用JavaFX编写Java3D应用吗?它兼容VRML或者X3D标准、Xj3D之类的代码库吗?ITPUB个人空间(~,I*}PZ@KY[5N%J

[)P.x4i/z}~ w|0没有原因不能使用。JavaFX能够和任何第三方代码库互操作,并且不需要任何特殊语法。目前JavaFX开发团队正在进行开发支持Java3D的功能。
5]d P9ZEJ/a0
4i} LD T p Tf0JavaFX是一种RCP(Rich Client Platform) 吗?
%l9tcu!C)[0ITPUB个人空间1HASsG
是的。JavaFX不仅能够用于RCP开发,也能够用于RIA(Rich internet Applications)开发。ITPUB个人空间&i,g_R&Y Ir(W
ITPUB个人空间t(V*h*d^y4`?)E
我能够在web应用中使用JavaFX吗?ITPUB个人空间 x-[|4Of/ws-m-Ug

6arx9Hz m c0JavaFX能够用于编写前端应用、web应用的视图或者用户接口,不过这都需要JVM的支持。ITPUB个人空间-Q&Ih+A!N$I:w/p

*k4xG\ F+n,\J0JavaFX将代替Java EE中的JSF和JSP吗?ITPUB个人空间{"on A-JkF+^Q

c$O&o5|$~4_J0不, JSF和JSP用于编写纯粹的web应用(对于支持HTML的HTTP客户端来讲是可用的),而JavaFX需要位于客户端的JVM。如果你希望编写富客户端的话,那么就需要在客户端安装JRE,JavaFX能够提供与基于Flash的Flex、基于.net的Silverlight相同的功能。常见的应用场景是开发运行在公司内网的应用。
4i5mg0OAx0ITPUB个人空间(G.B~-A[KR9q9jG
JavaFX在运行时需要服务器吗?
~6^T a2vy0
ITPUB个人空间KZ i@$L1XO_H
JavaFX是一种关注GUI的脚本语言;它主要用于桌面应用,因此不需服务器。如果你计划部署JNLP(Java Web Start)的话,那么你需要一台web服务器。
+n/^stTN0
B Z_ j'o'X:B}0运行JavaFX需要什么条件?ITPUB个人空间1] X4F,ob3C

w.h X1i8B@0两种条件任选其一:ITPUB个人空间Q2[y{s1h
Java5以上、一个兼容JSR-223的实现、JavaFX代码库;ITPUB个人空间\iq y1d
Java6以上、JavaFX代码库。ITPUB个人空间 k]vm(r"fmHz
ITPUB个人空间E2C9rS:i/M8N} Db$I
目前有JavaFX可用的编译器吗?
,v&b^)bn&H5qC1V0
uCQ+U{b/T$Z0OpenFX Compiler是JavaFX编译器项目,目前已经开放源代码。
K9O(Po5]tW0详细情况请访问:https://openjfx-compiler.dev.java.net/ITPUB个人空间n}_-s1K5T;NH`2V
ITPUB个人空间.ja3r5I'Y-IB'ZI$s?
开发中遇到的问题ITPUB个人空间%Rq pn)oBU J&k
ITPUB个人空间,F/s.W#q'K }/w%rG
JavaFX中有哪些固有的数据类型?
(Y rII5Fqh6Zq e0
c@Z8snD0JavaFX中的固有数据类型:String、Boolean、Number、Integer。
Fsr+v+b:[0
$@S$\v z*g0JavaFX与Java类型之间的对应关系:
Wa;UQ ^Y0
,s{C Y&~6G%dC0
更多信息请访问:ITPUB个人空间 P2x"vR.b1AA"v x n4c
https://openjfx.dev.java.net/JavaFX_Programming_Language.html#basic_types
/OM)N Av5@5dE4m"}["f v0
ITPUB个人空间F;j1g2[0q|b
如何连接两个字符串?“+”操作符已经不起作用了!?ITPUB个人空间1z7U;Lr%@
ITPUB个人空间D G3CUe*U}#W
与Java有所不同,JavaFX并没有重载“+”操作符来使其用于字符串连接:ITPUB个人空间PbfcK|.H9i
import javafx.ui.*;import javafx.ui.canvas.*; Frame. { content: Label { text: "Hello " + "World" } visible: true}ITPUB个人空间p Rsbr5Ne
如果尝试运行上面的代码,我们将看到以下的控制台输出:
2y&K1~F T$aWQG#mh0compile 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"
:DO|I+z Hr*v*v\6i0
p:l A j;YlI2Y0实现方式之一:修改代码
Fp2Nokn#K)l0
1?:~-t s U1o0Java实现方法:ITPUB个人空间T8p+K \5?,d6V:[4K2ad
String s = "Your score is " + n + " out of " + total + ".";
L wD Z+vBK0JavaFX的字符串表达式操作符{}实现连接字符串的功能:
OK&z/b3y%k(bQ v0var s:String = "Your score is {n} out of {total}.";ITPUB个人空间O:d;w|%j4v sgly;kS*?
ITPUB个人空间W)tE/a8k#|_(W-d
实现方式之二:调用concat()方法ITPUB个人空间W+v+Z%OW|`{A
ITPUB个人空间T i|O[ i!?]L
JavaFX提供了concat()方法来连接两个字符串:
&h4P\I*`/C1i0import javafx.ui.*;import javafx.ui.canvas.*; Frame. { content: Label { text: "Hello ".concat("World") } visible: true}
e5Ew]R,k#P]0
a(y Z2PO2I(V _0如何将字符串转换为数字?ITPUB个人空间!]ad`1`%t-f-vR

y.WcGbl/Q0目前没有直接的方式,但可以使用下面的代码:
4zfh'\U)I%k.\3j0var value = new DecimalFormat("0").parse(someString);ITPUB个人空间m-V `S8Cc
ITPUB个人空间6V"lI m4nK+g2J
如何将TextField的数值绑定到一个数字类型属性?ITPUB个人空间0R$Ho];Xu%\G

4B[oP3{0使用绑定::
o:k~zJ-s.zoMD&vv0var total = 10TextField { value: bind total ...}
{\GfY0也可以使用format进行格式化:ITPUB个人空间B|j4lr0xq,A:P
value: bind "{total format as <<#,##0>>}"ITPUB个人空间/X-PB#Wwe Y!B
ITPUB个人空间1yV&cTu` aC
如何设置用在Java Web Start上的JavaFX?ITPUB个人空间:|(L9X_LK

D8S"b-Tn/Z L0JNLP (Java Network Launch Protocol)是一种基于XML的协议,它能够在网络上部署Java和JavaFX应用。
8Tz#T S3dRg![0这里提供一个用于部署JavaFXPad的JNLP示例。ITPUB个人空间0V&PV"MH
详细示例请见:http://download.java.net/general/openjfx/demos/javafxpad.jnlp) 。ITPUB个人空间u-e!^rt4y9x _1w5m
<?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个人空间2hZ'i;eT6m%n

%rS0q+OVdZ0“Hello Web Start FX”示例
ZLTD9UVp0ITPUB个人空间!FH u5h kaU
环境需求ITPUB个人空间"J;A9Lw |
• Java 5 JDK
+_*`Z4J.U-oo)Yy6DQ0• 从openjfx项目下载后获得的JavaFX代码包中提取出来的/lib/javafxrt.jar and lib/swing-layout.jar
.?(h6f2q.K0
(qX;AX;bl*~[R9b0“Hello Web Start JFX”程序代码
QwhE"Fo w,c I/z0
:w(w+aJ4G#iv0文件名: HelloWebStart.fx
*W#`r7S&w+N3f0import 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个人空间2@!V7u!@`
ITPUB个人空间Bi A#C4t6R;~g
创建 HelloWebStartJFX.jar
"{~ L A'~:N0ITPUB个人空间TZ Sj\ p-x{
jar cvf HelloWebStartJFX.jar HelloWebStart.fxITPUB个人空间y!`X2Y9FX
ITPUB个人空间o [-dQT+g)l\-X
创建 HelloWebStartJFX.jnlp
n U/Lz ?P U7dH0ITPUB个人空间v\2[4Kk y.F,m
文件名: HelloWebStartJFX.jnlp
u4Vu)?%q|{m{0<?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>
2d%NhR5fe _0
B!m0vZ f _7`0创建签名密钥ITPUB个人空间!aT"P }$W'I,P7[eM

Xer&X$r/} S I%U0keytool -genkey -alias jfx -dname "CN=John Doe, O=JFX Inc." -validity 9999 -keystore jfx.keystore -keypass keyPassword -storepass storePassword
\ E9Uf4k0
2q%a(?,`6R4F;q0对jar文件进行签名ITPUB个人空间C5Tz(O%|"P:BLP

%t8H"TB R.zE0jarsigner -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
(GD*J,]"_ q0ITPUB个人空间 Ojb[@#hp?+F
连接到HelloWebStartJFX.jnlp
8tes.t {7x F8Tg0ITPUB个人空间ERD\/T[1b4Tr
文件名: index.htmlITPUB个人空间zzOx BP a)|
<!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>
!Q;jJ(z? R2H b0ITPUB个人空间l%`'?o a%Cl qM1H _
Web服务器: 设置用于.jnlp 的MIME类型ITPUB个人空间zW~gq G [)O-_ K4R
ITPUB个人空间6b)^k#Q N@
Apache服务器:在http.conf 或者 .htaccess文件中添加类型:ITPUB个人空间9H7}$JP7d/W#oWT
application/x-java-jnlp-file JNLP
iwE0rzU^6sZ0ITPUB个人空间 Sy };X_,Y0@?
将文件复制到Web服务器ITPUB个人空间!i2n&e!se
mkdir /www/www.example.com/docs/HelloWebStartJFX/cp index.html HelloWebStartJFX.jnlp HelloWebStartJFX.jar javafxrt.jar swing-layout.jar /www/www.example.com/docs/HelloWebStartJFX/
KEIW8X3Y|9}9y0
!se;a9P!v/R(^0启动Web Start
SO-T)W!W'v+G%@^ r0ITPUB个人空间0_*X+h9B9A3{a*F1X'}
通过www.example.com/HelloWebStartJFX/启动web Start。
Qjw&Z's*H0ITPUB个人空间J1u:u%pS^N{
如何使用“全限定名”引用Java类?ITPUB个人空间!t9C0m{ B
ITPUB个人空间H5}Q3b| uT
全限定Java类名必须使用法语引号<< >>进行修饰。
B"` o't"bf5z7G0
HJ"LHCn|0如何访问内部类和接口?ITPUB个人空间O4`ka!j `M8p
ITPUB个人空间0x;G;T wk2fq;h;dS;Dk
在访问内部类和接口时,你只能使用内部类的编译名。
"hQQ C Z0例如:
[wQ MmN0在Java中的import java.util.Map.Entry,在JavaFX中将表示为import java.util.Map$Entry。
P7e8na'Q"C0
(g1^ L1^f"tr0在JavaFX中还需要注意的是在引用内部类时,你需要继续使用Outer$Inner 这种形式的语法。为了方便使用,你也可以相应地将导入语句修改为:ITPUB个人空间r0|F7e6^j4N2H`6V@
import java.util.Map$Entry as Entry
vcJk a'Vb0这样就不必重复地使用Outer$Inner形式了。
P3b4K6L:Ar0我能够使用Java 5的枚举(enumerations)吗?
(|.SK5m#H6wv r7s1_K0当然可以。你可以采用下面的方式引用它们:
-R:j_(u5E;[ F"v0import java.util.management.MemoryType; // 导入枚举 var value = HEAP:MemoryType; // 使用枚举值 // HEAP是MemoryType中的枚举值 var allValues = MemoryType.values(); // 创建包含所有枚举值的JavaFX数组
.| \~G2X G!P0ITPUB个人空间~'j8@;NN)_ UR l
如何在JavaFX中轻松定制Swing组件?ITPUB个人空间 U+V{L!f)|c

(V(~`2XJ0这里提供了一些对Swing组件进行快速封装的代码,它能用于JavaFX组件层中:
]JIkBK\%t E @h0ITPUB个人空间GuA4Ky r(C
SwingWidget类定义:ITPUB个人空间e'bvO#V L3Qu

/jFIr!\0文件名:SwingWidget.fx
$`2T-?/d#QD0package 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;}
+` W{c w/A0ITPUB个人空间)C#?AP5ERX6RP
用法:ITPUB个人空间p3{%f&}`?3n

3Q/|9Q1_%z?%e)A0下面提供了一个使用SwingWidget的简单示例。请注意在树形列表中提供的数据来自于默认的树形模型,而不是JavaFX所特有的。
h z(w:Xv RP};e\,Q0文件名:WidgetTest.fxITPUB个人空间%[/st P&U-q)qLtL2I%W
package 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"}
!m5r lBX@)[0运行界面:ITPUB个人空间L@9\ ]wI!wV `t/`L
ITPUB个人空间IME7o%F8sLY'O
ITPUB个人空间2o Hw }i
为什么我的某些.fx文件不能被JavaFX Pad重新装载?ITPUB个人空间D:~6b aj c#|
ITPUB个人空间"N3k9B5W1n'u3om6S!I
非常抱歉地告诉你,JavaFXPad目前的功能非常有限。他并不能检测到外部文件的改变。为了让它能够“看到”你的修改,你需要以手工的方式在JavaFXPad中重新打开修改后的文件。ITPUB个人空间4F!JR$C%Ik
ITPUB个人空间%JA'O^,t%b_&O6E
如何引用其它JavaFX文件?
,rwp-EY%bj/a,h0
&u&~:x(e$_j&B bw:h0JavaFX能够从以下三种资源中引用静态值、变量和类:ITPUB个人空间kU"X&Dp_7L!j R Z+nt
1.在同一文件内ITPUB个人空间|;\p&k6n @9s
2.在相同的目录/包路径下的文件
l[.n/jd\03.在其它的包路径下的文件ITPUB个人空间Q T:NC7p4R7|TQ
ITPUB个人空间q#pwtk`{"I
首先,第一种方式非常简单。如果你正在引用处于相同文件中的类,那么你只需要使用类名即可(类可以被定义在引用之前或者之后)。而变量则要在它们被声明之后才能被引用。
)WAs3EW W%~^ |a0ITPUB个人空间u0VH!r:?-{o t t
对于第二种方式,显而易见,你无须对处于相同包路径下的每个.fx文件都使用import语句,而只要提供具有它们所在的同一包路径的import语句即可。ITPUB个人空间7P?l^+[!l2\

g C9B.^8I6} V8}!O0如果你有其它的内部类或者你需要从不同的包路径下引入类,那么就需要使用import语句完成一点额外工作:使用import语句将.fx文件导入,而不是在此文件中的某个特定的类。例如,如果MediaTable.fx包含两个类:MediaTableColumn和MediaTableRow,那么你只需要importing MediaTable这一条语句就可以导入这两个类。ITPUB个人空间6Pr4{{H

zR oUntwN0你也可以像使用Java一样使用 import *语句。但由于这种方式降低了代码的可读性,所以并不推荐给大家。
Q'To{Qnj0ITPUB个人空间,`k:]ZT i1{%|7@6^!z
JavaFX脚本提供类似 __LINE__这样的魔术常量(magic constants)吗?ITPUB个人空间d n+ok UA(C9Q|(u

#r?4PLP)iv y+^+TO:l0魔术常量ITPUB个人空间HQY#G&p8K0ho1k

Ps*y[-|2vbi0• __DIR__ -- 返回包含当前FX源文件的目录的URL。如果当前文件是从jar文件装载的,那么返回值可能是jar文件的URL。
*lYu({z6q5Q db0• __FILE__ -- 返回当前源文件的URL。ITPUB个人空间y7vx"lX/^#v uJ
• __LINE__ -- 返回当前源文件中的当前行。ITPUB个人空间&};Z5mT-uJR#h0r
• __ARCHIVE__ -- 返回包含当前文件的jar文件的URL。
cE6v q&k0DEJt0ITPUB个人空间^b+f[(lmL
示例
B#yIB~"t+h0xCq0ITPUB个人空间0B1nlx;i*J
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.
yw.Q`KA0
2z)g:j1I(_ s9?!gL0更多信息
w(aI;q+X`Z/U_ GX0ITPUB个人空间 I6LpQC w
• Christopher Oliver编写的"Magic Constants"ITPUB个人空间A"lf3U Y6K5AWh
ITPUB个人空间8V`nHeyl
JavaFX中的保留字有哪些?ITPUB个人空间y?"Y3Oc}"|

xa j`7I i%J H0after
!\y+sEH8g ^YI0andITPUB个人空间Ww+oO D
as
`%L6E9ra`Md(M}:D0assert
d%x7W ? ac[0attributeITPUB个人空间-L t+D,x~_
before
/`6E4poCm%e0bind
v-X%GtU.yk{0breakITPUB个人空间_f soK,]9R
byITPUB个人空间G\9bupxp
catch
N)}\ a.Pt){]0classITPUB个人空间qd h b YIQ'q
continue
-wk:dn g cm)X4C9L/M0deleteITPUB个人空间?Xl/m|*dkG]n3hY7F
distinctITPUB个人空间} B6L#em*p E-g
do
9Z*s@ v2?9J0dur
Wb Aim iV0easebothITPUB个人空间:vyCg{~
easeinITPUB个人空间g7^+e x+C [&k
easeout
m ]oo+`F8bxZ;ik0elseITPUB个人空间Y l2@mZBK
endifITPUB个人空间+B,e8n2A[ Bl
extends
kR#L5o3A \9}9p0falseITPUB个人空间5Z]H6Bur*SY
finally
/^Bq9U3sg1T I0first
D g e*@!~k0for
T4Ry!Q,J(ME1p1uk0foreach
UsfWr U,D,xJ.Z0formatITPUB个人空间k7JJz"C x
fpsITPUB个人空间"NB8S)T1L$c}M4n-yH,w)d
from
5A4p4Q^ MR^0function
"B,a1FwJ:y.x6x0ifITPUB个人空间LF]sj1Ae
importITPUB个人空间W7g#uw4p^,Gf
inITPUB个人空间Evkgh)J
indexITPUB个人空间R3hd*f` tnG
indexofITPUB个人空间d t*Q*U c
insertITPUB个人空间"i gP6] X1S)jKr/`
instanceof
9[.r(mJXO5tP*u5w|R W0into
p"W5k%E#ysS"Q[0inverse
VnD'jd5b_F0lastITPUB个人空间t0yO s[ N!Q
laterITPUB个人空间8B_s q fpT%j
lazy
W%I(H4k3L Y7]k0linearITPUB个人空间2U'Vl"RF)b` nD!o H
motionITPUB个人空间_Ab:SD9R-^
nodebugITPUB个人空间1y B$|!?3pN
new
~M0\)`!xd0notITPUB个人空间@I"g&Jfk.`I9tH!f
null
6_*};wT l5|?(?\:r7L0onITPUB个人空间~2|$wO`3g!}y&mle
operation
Vs/mvu{l-v0orITPUB个人空间 T R0]Do"W
orderITPUB个人空间\6A.l6}v1C
packageITPUB个人空间4|9pJ6{$d h'F%[ Awy
privateITPUB个人空间PFFut
protected
rq;Qck dH0public
W5DS `'ZYn'_0readonlyITPUB个人空间w!t*ZA]"J
return
1s0t s(kb G9p+B0reverse
NA g_1J0selectITPUB个人空间M4~c2^\+q4q DQ f4P
sizeof
{iD&_6E? AV`.Y:p0superITPUB个人空间IL$[${uyli
thenITPUB个人空间 bZ#t)p8C} YK\
thisITPUB个人空间7i%Y*jmV4IX^,u-?m
throw (请注意不是throws)
%^p%fA9Ef6X!iV0trigger
Sd5x f&~L0true
9^2`n `4K4gAw0try
_{gY&_4Gl8J0typeofITPUB个人空间rg;eV/Y.^1[+GE
unitinterval
b*nc L[5vf\:Y0valueofITPUB个人空间3{{l/q:W-reqm?2F
var
1X{6u+PVa]V0whereITPUB个人空间*dF4AD-J(p ^+z!M
whileITPUB个人空间'IU}9i0Ae7r1{
xor


TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 665817
  • 日志数: 3733
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2010-12-31

RSS订阅

Open Toolbar