(转载)JavaFX应用问题解答
原帖发表于: 构客网
原文链接: http://gocom.primeton.com/modules/newbb/item40292_40292.htm?referer=csdn&utm_campaign=gocom&utm_source=csdn&utm_medium=lks
本文将JavaFX用户在日常使用、开发工作中遇到问题收集汇总,形成“JavaFX应用问题解答”。希望读者也能够将自己在使用JavaFX中的问题提交到这里或是OpenJFX maillist!
JavaFX是什么?
“JavaFX脚本是一种声明式、静态类型编程语言。它具有一等函数(first-class functions)、声明式的语法、列表推导(list-comprehensions)及基于依赖关系的增量式求值(incremental dependency-based evaluation)等特征。”JavaFX脚本为多种多样的操作提供了声明式、无中间程序逻辑的语法,这些操作包括创建2D动画、设置属性或者声明在模式和视图对象之间的绑定依赖关系。
什么样的函数能够称为“first-class functions”?
在编程语言中,我们常常把那些将函数作为一等对象的函数称为一等函数(first-class functions)。具体地说,就是编程语言支持在程序执行过程中构造新的函数,并将它们存储在数据结构中作为其它函数的参数的传入参数,并在函数返回时将它们作为函数值返回。本概念并不涵盖任何语言和程序的外部函数或者程序,例如通过调用编译器或者一个eval函数来创建新函数。
这里提供一等函数的一个简单示例:map或者mapcar函数,它使用一个函数和一个列表作为参数,然后将通过将函数应用到列表中的每个成员后形成的列表作为返回值。
“declarative syntax”是什么意思?
与大多数依靠程序和显式代码来更新在变量或者属性之间关系的编程语言不同,声明式语言允许数值被声明为另一种方式。
在JavaFX的一个示例:
更多信息请访问:
https://openjfx.dev.java.net/JavaFX_Programming_Language.html#basic_types
如何连接两个字符串?“+”操作符已经不起作用了!?
与Java有所不同,JavaFX并没有重载“+”操作符来使其用于字符串连接:
如果尝试运行上面的代码,我们将看到以下的控制台输出:
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实现方法:
实现方式之二:调用concat()方法
JavaFX提供了concat()方法来连接两个字符串:如何将字符串转换为数字?
<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- "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文件中添加类型:
将文件复制到Web服务器
启动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 这种形式的语法。为了方便使用,你也可以相应地将导入语句修改为:
如何在JavaFX中轻松定制Swing组件?
这里提供了一些对Swing组件进行快速封装的代码,它能用于JavaFX组件层中:
SwingWidget类定义:
文件名:SwingWidget.fx
用法:
下面提供了一个使用SwingWidget的简单示例。请注意在树形列表中提供的数据来自于默认的树形模型,而不是JavaFX所特有的。
文件名:WidgetTest.fx
}运行界面:
??
为什么我的某些.fx文件不能被JavaFX Pad重新装载?
非常抱歉地告诉你,JavaFXPad目前的功能非常有限。他并不能检测到外部文件的改变。为了让它能够“看到”你的修改,你需要以手工的方式在JavaFXPad中重新打开修改后的文件。
如何引用其它JavaFX文件?
JavaFX能够从以下三种资源中引用静态值、变量和类:
??????? 1.在同一文件内
??????? 2.在相同的目录/包路径下的文件
??????? 3.在其它的包路径下的文件
首先,第一种方式非常简单。如果你正在引用处于相同文件中的类,那么你只需要使用类名即可(类可以被定义在引用之前或者之后)。而变量则要在它们被声明之后才能被引用。
对于第二种方式,显而易见,你无须对处于相同包路径下的每个.fx文件都使用import语句,而只要提供具有它们所在的同一包路径的import语句即可。
如果你有其它的内部类或者你需要从不同的包路径下引入类,那么就需要使用import语句完成一点额外工作:使用import语句将.fx文件导入,而不是在此文件中的某个特定的类。例如,如果MediaTable.fx包含两个类:MediaTableColumn和MediaTableRow,那么你只需要importing MediaTable这一条语句就可以导入这两个类。
你也可以像使用Java一样使用 import *语句。但由于这种方式降低了代码的可读性,所以并不推荐给大家。
JavaFX脚本提供类似 __LINE__这样的魔术常量(magic constants)吗?
魔术常量
??????? ? __DIR__ -- 返回包含当前FX源文件的目录的URL。如果当前文件是从jar文件装载的,那么返回值可能是jar文件的URL。
??????? ? __FILE__ -- 返回当前源文件的URL。
??????? ? __LINE__ -- 返回当前源文件中的当前行。
??????? ? __ARCHIVE__ -- 返回包含当前文件的jar文件的URL。
示例更多信息: Christopher Oliver编写的"Magic Constants"
<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--validity 9999 -keystore jfx.keystore -keypass keyPassword -storepass storePassword?
JavaFX的字符串表达式操作符{}实现连接字符串的功能: