JavaFx如何为自定义gui构建器设置FXML加载程序

时间:2018-03-07 09:55:03

标签: javafx

我在FXML文件上有一个组件,其中包含以下行:

<AnchorPane xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="DataTableController">

我正在尝试在控制器中加载fxml:

public DataTableController() throws IOException {
        FXMLLoader.load(getClass().getResource("DataTable.fxml"));
}

我没有扩展Application的类,我没有main方法,因为我已经有一个由另一个应用程序(自定义场景构建器)启动的窗口。所以,我只想在自定义视图组件的窗口上显示AnchorPane。我可以使用我的控制器做到这一点,没有问题。我的问题是,当我不使用fx:root时,我不知道如何加载FXML,因为当我将AnchorPane更改为fx:root时,我可以加载FXML并设置root并设置控制器并查看fxml文件的内容在我的窗户上。但是,我有一个问题,我无法在fxml文件中设置控制器,因为它是设置控制器的重复,如果我没有在fxml文件中设置控制器,那么我得到一个错误,因为我有一个需要设置控制器的按钮。

那么,我该怎么办?我们什么时候使用fx:root,为什么? (我用Google搜索并检查了其他SO条目但仍然不清楚我的想法)。任何关于我的问题的建议和关于fx:root的一些例子的明确解释将不胜感激。

我是JavaFX和SO的新手,所以如果我不能很好地解释我的问题,请恳请我澄清一下。谢谢你的帮助!

编辑:改变了@cabian建议的java类,以及我之前尝试过的 and get this error as I mentioned above.

1 个答案:

答案 0 :(得分:0)

  

如果我没有在fxml文件中设置控制器,那么我得到一个错误,因为我有一个需要设置控制器的按钮

不正确。只要在加载fxml之前设置FXMLLoader的控制器实例,就不会有问题。

推荐的实现方法如下:

public class DataTableController extends AnchorPane {

    public DataTableController() throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("DataTable.fxml"));

        // set this instance as root & controller
        loader.setRoot(this);
        loader.setController(this);

        loader.load();
    }

    ...

}
<fx:root xmlns="http://javafx.com/javafx/9.0.1"
         xmlns:fx="http://javafx.com/fxml/1"
         type="javafx.scene.layout.AnchorPane">
    ...
</fx:root>