JavaFX2.0中使用连续的$作为转义字符,这个已经在2.1中被改变了。
这个特性有利于将Controller和UI进行双向绑定。从JavaFX2.1开始双向绑定被废弃了,但是这个特性得到了保留。
FXMLLoader类增加了一些新的构造器,这些构造器与FavaFX2.0中的静态方法load()一样,但是通过代码可以更为方便地访问文档的Controller。
在JavaFX2.0中,对于Controller的创建过程是没有任何控制的。这使得应用程序无法使用依赖注入系统来管理Controller的初始化,例如Google Guice或Spring Framework。JavaFX增加了一个Callback接口来对Controller的构造进行代理。
public interface Callback {
public Object getController(Class> type);
}
如果向FXMLLoader对象提供了一个Controller Factory,则loader会将Controller的构造过程委托给Factory。对应的实现类必需返回一个null值来标识其没有或者无法创建一个对应类型的Controller;此时loader就会启用默认的Controller构造机制。实现类还可以“重用”Controller,这样controller实例可以被多个FXML文档所共享。然而开发者必须了解这样做的隐含意义:首先,controller属性的注入不应该以此种方式来进行,因为这样会导致在controller的属性中包含最近加载的文档中值。
在JavaFX2.0中,将样式表添加到FXML中非常不方便。在JavaFX2.1中得到了显著简化,样式表可以通过
在JavaFX2.0中,Controller中的事件处理器必须遵守特定的方法声明。它必须传递一个继承自Event类的参数,并且返回值必须为void。在JavaFX2.1中,参数限制已经被移除了,并且可以编写无参数的控制器事件处理器。
新增了
在JavaFX2.1及其之前的版本,从root Controller类中访问子Controller不是很方便。这导致用Controller来打开并绘制一个内容在include元素中的对话框很难。
JavaFX2.2将嵌套的Controller实例直接映射到外部Controller的成员属性中,使得与嵌套的Controller交互变得更为简单。例如下面的FXML文档和Controller样例:
...
...
public class MainController extends Controller {
@FXML private Window dialog;
@FXML private DialogController dialogController;
...
}
在JavaFX2.1及其之前的版本中,Controller类需要实现Initializable接口,这样当关联的FXML文件被加载完毕后将会获得通知。在JavaFX2.2这不再是必须的。FXMLLoader类的实例仅会在initialize()方法可用时进行调用。注意,与其它的FXML回调方法(例如事件处理器)类似,如果此方法不是public的则必须使用@FXML注解来声明。
建议开发者在新的开发过程中逐渐不再采用此接口,目前虽然Initializable接口还没有被废弃,但是不排除在未来的发布版本中会废弃。
在之前的版本中,定义基于FXML的控件是件很复杂的事情。在JavaFX2.2中提供了一些细致而强大的改进来简化这个过程。新的setRoot()和setController()方法允许通过代码来分别将文档root节点和Controller的值注入到文档的命名空间中,而不再将对这些对象的创建委托给FXMLLoader。这样我们可以通过XML来创建控件,这与编程方式创建控件一样。
例如下面的XML文件定义了一个简单的自定义控件结构,其中包括一个TextField和Button实例。Root容器被定义为javafx.scene.layout.VBox:
在JavaFX2.2中增加了
详见后面的章节“使用FXML来创建自定义控件”
如果在JavaFX2.1 中使用FXML loader来加载JavaFX2.0的FXML文档,可能会遇到下面所描述的不兼容情况。
下表列出了在JavaFX2.0中曾使用而在JavaFX2.1中被废弃了的双字符转义字符。在JavaFX2.1中使用反斜杠来作为替代。
JavaFX2.0转移序列 |
JavaFX2.1 转义序列 |
$$ |
\$ |
%% |
\% |
@@ |
\@ |
如果Scene Builder遇到了被废弃的转义字符会在控制台上输出警告信息,但是仍会将FXML文件加载进来。在下次文件被保存时将会自动按新的转义字符进行转换和保存。
在JavaFX2.1中,反斜杠\在FXML中是一个转义字符。在JavaFX2.0中,如果FXML文件包含以反斜杠开头的字符串属性可能导致FXML无法加载,或者可能导致FXML loader错误解析字符串。
解决方案:在JavaFX2.0应用中对于带有反斜杠文本的FXML,在转义字符前增加一个反斜杠。
例如:
移除下面的代码行:
替换为下面的代码行: