【问题标题】:JavaFx How to set FXML loader for custom gui builderJavaFx 如何为自定义 gui builder 设置 FXML 加载器
【发布时间】:2018-08-15 09:02:42
【问题描述】:

我在 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 以及为什么? (我用谷歌搜索并检查了其他 SO 条目,但我仍然不清楚)。任何对我的问题的建议和关于 fx:root 的一些示例的清晰解释将不胜感激。

我对 JavaFX 和 SO 很陌生,所以如果我不能很好地解释我的问题,请让我澄清一下自己。感谢您的帮助!

编辑:按照@fabian 的建议更改了 java 类,我之前实际尝试过 and get this error as I mentioned above.

【问题讨论】:

    标签: javafx


    【解决方案1】:

    如果我没有在 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>
    

    【讨论】:

    • 我用截图编辑了我的答案。你能检查一下吗?
    • @Dawsey 这只是 NetBeans(?) 抱怨。不过,它不会导致您的 JavaFX 应用程序出错。唯一的缺点是 NetBeans 无法再检查控制器类的引用成员是否存在于编辑器中...
    • 谢谢,你说得对!这只是 NetBeans 的抱怨,按钮有效。只是看到红旗没试过。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2012-06-26
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多