不,JSF和JSP用于编写纯粹的web应用(对于支持HTML的HTTP客户端来讲是可用的),而JavaFX需要位于客户端的JVM。如果你希望编写富客户端的话,那么就需要在客户端安装JRE,JavaFX能够提供与基于Flash的Flex、基于.net的Silverlight相同的功能。常见的应用场景是开发运行在公司内网的应用。
JavaFX在运行时需要服务器吗?
JavaFX是一种关注GUI的脚本语言;它主要用于桌面应用,因此不需服务器。如果你计划部署JNLP(Java Web Start)的话,那么你需要一台web服务器。
运行JavaFX需要什么条件?
两种条件任选其一:
Java5以上、一个兼容JSR-223的实现、JavaFX代码库;
Java6以上、JavaFX代码库。
目前有JavaFX可用的编译器吗?
OpenFX Compiler是JavaFX编译器项目,目前已经开放源代码。
详细情况请访问:https://openjfx-compiler.dev.java.net/
开发中遇到的问题
JavaFX中有哪些固有的数据类型?
JavaFX中的固有数据类型:String、Boolean、Number、Integer。
JavaFX与Java类型之间的对应关系:
更多信息请访问:
https://openjfx.dev.java.net/JavaFX_Programming_Language.html#basic_types
如何连接两个字符串?“+”操作符已经不起作用了!?
与Java有所不同,JavaFX并没有重载“+”操作符来使其用于字符串连接:
import javafx.ui.*;import javafx.ui.canvas.*; Frame { content: Label { text: "Hello " + "World" } visible: true}
如果尝试运行上面的代码,我们将看到以下的控制台输出:
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"
实现方式之一:修改代码
Java实现方法:
String s = "Your score is " + n + " out of " + total + ".";
JavaFX的字符串表达式操作符{}实现连接字符串的功能:
var s:String = "Your score is {n} out of {total}.";
实现方式之二:调用concat()方法
JavaFX提供了concat()方法来连接两个字符串:
import javafx.ui.*;import javafx.ui.canvas.*; Frame { content: Label { text: "Hello ".concat("World") } visible: true}
如何将字符串转换为数字?
目前没有直接的方式,但可以使用下面的代码:
var value = new DecimalFormat("0").parse(someString);
如何将TextField的数值绑定到一个数字类型属性?
使用绑定::
var total = 10TextField { value: bind total ...}
也可以使用format进行格式化:
value: bind "{total format as <<#,##0>>}"
如何设置用在Java Web Start上的JavaFX?
JNLP (Java Network Launch Protocol)是一种基于XML的协议,它能够在网络上部署Java和JavaFX应用。
这里提供一个用于部署JavaFXPad的JNLP示例。
详细示例请见:http://download.java.net/general/openjfx/demos/javafxpad.jnlp) 。
<?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>
“Hello Web Start FX”示例
环境需求
• Java 5 JDK
• 从openjfx项目下载后获得的JavaFX代码包中提取出来的/lib/javafxrt.jar and lib/swing-layout.jar
“Hello Web Start JFX”程序代码
文件名: HelloWebStart.fx
import 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}
创建 HelloWebStartJFX.jar
jar cvf HelloWebStartJFX.jar HelloWebStart.fx
创建 HelloWebStartJFX.jnlp
文件名: HelloWebStartJFX.jnlp
<?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>
创建签名密钥
keytool -genkey -alias jfx -dname "CN=John Doe, O=JFX Inc." -validity 9999 -keystore jfx.keystore -keypass keyPassword -storepass storePassword
对jar文件进行签名
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
连接到HelloWebStartJFX.jnlp
文件名: index.html
<!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>
Web服务器: 设置用于.jnlp 的MIME类型
Apache服务器:在http.conf 或者 .htaccess文件中添加类型:
application/x-java-jnlp-file JNLP
将文件复制到Web服务器
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/
启动Web Start
通过www.example.com/HelloWebStartJFX/启动web Start。
如何使用“全限定名”引用Java类?
全限定Java类名必须使用法语引号<< >>进行修饰。
如何访问内部类和接口?
在访问内部类和接口时,你只能使用内部类的编译名。
例如:
在Java中的import java.util.Map.Entry,在JavaFX中将表示为import java.util.Map$Entry。
在JavaFX中还需要注意的是在引用内部类时,你需要继续使用Outer$Inner 这种形式的语法。为了方便使用,你也可以相应地将导入语句修改为:
import java.util.Map$Entry as Entry
这样就不必重复地使用Outer$Inner形式了。
我能够使用Java 5的枚举(enumerations)吗?
当然可以。你可以采用下面的方式引用它们:
import java.util.management.MemoryType; // 导入枚举 var value = HEAP:MemoryType; // 使用枚举值 // HEAP是MemoryType中的枚举值 var allValues = MemoryType.values(); // 创建包含所有枚举值的JavaFX数组