文档



JavaFX:FXML大师
JavaFX发布2.1和2.2版本中的2个FXML增强功能

JavaFX 2.1和2.2中的FXML增强功能

以下是JavaFX 2.1和JavaFX 2.2中新增的FXML增强功能:

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

    JavaFX 2.0使用连续的运算符字符,如$$作为转义序列。JavaFX 2.1添加了对使用反斜杠字符的转义序列的支持,例如\$。这些转义序列更类似于统一表达语言(UEL),使开发人员更加熟悉。JavaFX 2.0的转义序列在JavaFX 2.1中已被弃用。请参阅JavaFX 2.1中已弃用的一些JavaFX 2.0 FXML转义序列反斜杠现在是转义字符

  • 控制器的隐式变量用于记录命名空间

    这个新功能方便了控制器和UI之间的双向绑定。JavaFX 2.1中取消了双向绑定,但保留了这个功能。

  • 方便构造函数到FXMLLoader类 (RT-16815)

    FXMLLoader类中添加了几个新的方便构造函数。这些构造函数与JavaFX 2.0中定义的static load()方法相对应,但更容易从调用代码中访问文档的控制器。

  • 可自定义的控制器实例化 (RT-16724, RT-17268)

    在JavaFX 2.0中,调用代码无法控制控制器的创建。这导致应用程序无法使用依赖注入系统,如Google Guice或Spring Framework来管理控制器的初始化。JavaFX 2.1添加了一个Callback接口来方便控制器构造的委托:

    public interface Callback {
        public Object getController(Class<?> type);
    }
    

    当向FXMLLoader对象提供控制器工厂时,加载器将委托控制器的构造给工厂。实现可能返回null值来指示它不会或无法创建给定类型的控制器;在这种情况下,加载器将使用默认的控制器构造机制。实现还可以“回收利用”控制器,以便控制器实例可以由多个FXML文档共享。但是,开发人员必须意识到这样做的影响:主要是在这种情况下不应使用控制器字段注入,因为它将导致控制器字段仅包含最近加载的文档的值。

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

    在JavaFX 2.0中,使用FXML应用样式表不太方便。在JavaFX 2.1中,这变得更简单。样式表可以作为根<Scene>元素的属性指定,如下所示:

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

    现在可以如下所示应用于单个节点的样式类:

    <Label styleClass="heading, firstPage" text="First Page Heading"/>
    
  • 调用者指定的无参控制器方法作为事件处理程序 (RT-18229)

    在JavaFX 2.0中,基于控制器的事件处理程序必须遵循事件处理程序定义的方法签名。它们必须接受一个扩展了Event类的单个参数,并返回void。在JavaFX 2.1中,参数限制已被取消,现在可以编写一个不带参数的控制器事件处理程序。

  • <fx:constant>标签

    在FXML中添加了<fx:constant>标签,以便于查找类常量。例如,java.lang.Double类定义的NEGATIVE_INFINITY常量现在可以按以下方式引用:

    <Double fx:constant="NEGATIVE_INFINITY"/>
    
  • 改进FXML中对子控制器的访问

    在JavaFX 2.1及更早版本中,从根控制器类访问子控制器并不容易。例如,使用控制器打开和填充在include语句中定义的对话框窗口就很困难。

    JavaFX 2.2将嵌套的控制器实例直接映射到包含文档控制器的成员字段中,从而更容易与嵌套的控制器交互。考虑以下FXML文档和控制器:

    <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;
    
        ...
    }
    

    当控制器的initialize()方法被调用时,dialog字段将包含从dialog.fxml文件加载的根元素,dialogController对象将包含include语句的控制器。然后,主控制器可以调用include语句的控制器的方法,例如填充和显示对话框。

  • 通过反射支持控制器初始化

    在JavaFX 2.1及更早版本中,控制器类需要实现Initializable接口,以便在关联的FXML文档的内容完全加载后得到通知。在JavaFX 2.2中,这不再是必需的。FXMLLoader类的实例只需查找控制器上的initialize()方法并调用它(如果可用)。请注意,类似于其他FXML回调方法(如事件处理程序),如果initialize()方法不是public,则必须使用@FXML注解。

    建议开发人员在新开发中使用这种方法。虽然Initializable接口尚未被弃用,但可能在将来的版本中被弃用。

  • 简化基于FXML的自定义控件的创建

    在之前的版本中,创建基于FXML定义内部结构的自定义控件相当繁琐。JavaFX 2.2引入了一些微妙但强大的增强功能,显著简化了这个过程。新的setRoot()setController()方法使调用代码能够将文档根和控制器值注入到文档命名空间中,而不是委托给FXMLLoader创建这些对象。这使开发人员能够创建内部使用标记实现的可重用控件,但(从API的角度来看)与以编程方式实现的控件完全相同。

    例如,以下代码标记定义了一个简单自定义控件的结构,其中包含一个TextField和一个Button实例。根容器被定义为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="点击我" onAction="#doSomething"/>
    </fx:root>
    

    新增的<fx:root>标签指定该元素的值将通过调用FXMLLoader类的getRoot()方法获取。在调用load()方法之前,调用代码必须通过调用setRoot()方法指定此值。调用代码还可以通过调用setController()方法为文档的控制器提供一个值。

    更多信息,请参阅使用FXML创建自定义控件

JavaFX 2.1和2.2版本中的2个FXML增强功能(发布8)
JavaFX发布2.1和2.2版本中的2个FXML增强功能(发布8)
关闭窗口

目录

JavaFX:掌握FXML

展开 折叠