JavaFX文档(10)掌握FXML——2 在JavaFX2.1和2.2版中对FXML的增强
2014-08-06 23:39
323 查看
声明:如需转载,请注明出处: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 转义序列 |
$$ | \$ |
%% | \% |
@@ | \@ |
反斜杠现在是转义字符
在JavaFX2.1中,反斜杠\在FXML中是一个转义字符。在JavaFX2.0中,如果FXML文件包含以反斜杠开头的字符串属性可能导致FXML无法加载,或者可能导致FXML loader错误解析字符串。解决方案:在JavaFX2.0应用中对于带有反斜杠文本的FXML,在转义字符前增加一个反斜杠。
例如:
移除下面的代码行:
<Button text=”\” />
替换为下面的代码行:
<Button text=”\\” />
相关文章推荐
- JavaFX文档(9)掌握FXML——1 为何选择FXML
- JavaFX文档(11)掌握FXML——3 使用FXML来创建地址簿应用
- JavaFX文档(12)掌握FXML——4使用FXML来创建自定义控件
- Atitit 艺术与编程艺术 项目工程艺术 1. 艺术可以分为造型艺术、表演艺术、综合艺术和语言艺术四大类。 1 2. 造型艺术 10 2 2.1. (一) 绘画和雕塑 11 2 2.2. (二
- [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续
- Android2.2 r1 API 中文文档系列(10) —— CheckBox
- Android2.2 r1 API 中文文档系列(10) —— CheckBox
- <转>Android2.2 r1 API 中文文档系列(10) —— CheckBox
- Android2.2 r1 API 中文文档系列(10) —— CheckBox
- JavaFX文档(6)开始JavaFX之旅——4 使用FXML来创建用户界面
- ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定
- ABP官方文档翻译 2.2 ABP会话
- Android2.2 API 中文文档系列(1) —— TextView
- JSF 2.0/2.1的javax.faces.bean.ViewScoped与JSF 2.2的javax.faces.view.ViewScoped
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第五部分(Page 10)
- DB2学习文档10——设置DB2环境
- ArcGIS 10 官方中文在线帮助文档,相当nice
- 2.1变量名及2.2数据类型及长度
- FCKeditor 2.2 + Asp.Net 设置 (文档编辑器的使用)