JavaFX文档(10)掌握FXML——2 在JavaFX2.1和2.2版中对FXML的增强

来源:互联网 发布:河北移动crm软件 编辑:程序博客网 时间:2024/05/29 18:36

声明:如需转载,请注明出处:http://blog.csdn.net/originer

原文地址:http://docs.oracle.com/javase/8/javafx/fxml-tutorial/jfx2_x-features.htm

 在JavaFX2.1和2.2中对FXML的增强

  •   支持反斜杠作为转义字符(RT-18680)

JavaFX2.0中使用连续的$作为转义字符,这个已经在2.1中被改变了。

  • 为controller设置了一个隐藏变量

这个特性有利于将Controller和UI进行双向绑定。从JavaFX2.1开始双向绑定被废弃了,但是这个特性得到了保留。

  • 为FXMLLoader类增加了更方便的构造器

FXMLLoader类增加了一些新的构造器,这些构造器与FavaFX2.0中的静态方法load()一样,但是通过代码可以更为方便地访问文档的Controller。

  •   Controller的初始化过程可以自定义(RT-16724, RT-17268)

在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的属性中包含最近加载的文档中值。

  •  更方便地使用样式表(RT-18299,RT-15524)

在JavaFX2.0中,将样式表添加到FXML中非常不方便。在JavaFX2.1中得到了显著简化,样式表可以通过<Scene>根元素的属性来指定:

<Scene stylesheets="/com/foo/stylesheet1.css, /com/foo/stylesheet2.css"></Scene>

在单个节点上的样式类可以通过与下面的例子类似方式来添加:

<Label styleClass="heading, firstPage" text="First Page Heading"/>

  •  Controller中可以将不带参数的方法指定为事件处理器。

在JavaFX2.0中,Controller中的事件处理器必须遵守特定的方法声明。它必须传递一个继承自Event类的参数,并且返回值必须为void。在JavaFX2.1中,参数限制已经被移除了,并且可以编写无参数的控制器事件处理器。

  • <fx:constant>标签

新增了<fx:constant>标签用于检索类常量。例如,一个java.lang.Double类型、名为NEGATIVE_INFINITY的常量可以采用下面的方法来引用:

<Double fx:constant="NEGATIVE_INFINITY"/>

  •  改进访问FXML中的子Controller的方式

在JavaFX2.1及其之前的版本,从root Controller类中访问子Controller不是很方便。这导致用Controller来打开并绘制一个内容在include元素中的对话框很难。

JavaFX2.2将嵌套的Controller实例直接映射到外部Controller的成员属性中,使得与嵌套的Controller交互变得更为简单。例如下面的FXML文档和Controller样例:

<VBox fx:controller="com.foo.MainController"> ...    <fx:include fx:id="dialog" source="dialog.fxml"/>...</VBox>public class MainController extends Controller {     @FXML private Window dialog;    @FXML private DialogController dialogController;    ...}

当Controller的initialize()方法被调用时,dialog属性将会包含从dialog.xml文件中加载的根元素,并且dialogController对象将会持有被包含元素的Controller。主Controller可以调用被包含的Controller中的方法,以此来填充和显示对话框。

 

  • 支持通过反射来初始化Controller

在JavaFX2.1及其之前的版本中,Controller类需要实现Initializable接口,这样当关联的FXML文件被加载完毕后将会获得通知。在JavaFX2.2这不再是必须的。FXMLLoader类的实例仅会在initialize()方法可用时进行调用。注意,与其它的FXML回调方法(例如事件处理器)类似,如果此方法不是public的则必须使用@FXML注解来声明。

建议开发者在新的开发过程中逐渐不再采用此接口,目前虽然Initializable接口还没有被废弃,但是不排除在未来的发布版本中会废弃。

  • 简化了创建基于FXML的控件

在之前的版本中,定义基于FXML的控件是件很复杂的事情。在JavaFX2.2中提供了一些细致而强大的改进来简化这个过程。新的setRoot()和setController()方法允许通过代码来分别将文档root节点和Controller的值注入到文档的命名空间中,而不再将对这些对象的创建委托给FXMLLoader。这样我们可以通过XML来创建控件,这与编程方式创建控件一样。

例如下面的XML文件定义了一个简单的自定义控件结构,其中包括一个TextField和Button实例。Root容器被定义为javafx.scene.layout.VBox:

 

<?import javafx.scene.*?><?import javafx.scene.control.*?><?import javafx.scene.layout.*?><fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml">    <TextField fx:id="textField"/>    <Button text="Click Me" onAction="#doSomething"/></fx:root>

 

在JavaFX2.2中增加了<fx:root>标签,指定了元素的值将会通过FXMLLoader类的getRoot()方法来获取。调用代码必须通过调用setRoot()方法来指定对应的值。调用代码也可以通过调用setController()方法来设置文档的Controller。

详见后面的章节“使用FXML来创建自定义控件”

 

FXML加载器与之前的JavaFX版本不兼容

如果在JavaFX2.1 中使用FXML loader来加载JavaFX2.0的FXML文档,可能会遇到下面所描述的不兼容情况。

 

JavaFX2.0中的部分转义字符在JavaFX2.1中被废弃了

下表列出了在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,在转义字符前增加一个反斜杠。

例如:

移除下面的代码行:

<Button text=”\” />

替换为下面的代码行:

<Button text=”\\” />

0 0
原创粉丝点击