TornadoFX 中 FXML 文件的前缀路径

Prefix path for FXML files in TornadoFX

有没有办法为 TornadoFX 使用的 FXML 文件提供路径,并使用其约定 by fxml()

通常,TornadoFX 通常会尝试在 src/main/resources 中定位 FXML 资源,但是,我们的应用程序很大,现在这可能是最好的主意。在我们的例子中,我们希望将文件维护在子目录中,即 src/main/resources/fxml

我们想在应用程序启动时设置它。这可能吗?

我已经在框架中添加了一个 FXML 定位器函数,这样您就可以覆盖它来更改资源位置。声明和默认实现如下所示:

var fxmlLocator: (component: UIComponent, location: String?) -> URL = { component, location ->
    val targetLocation = location ?: component.javaClass.simpleName + ".fxml"
    requireNotNull(component.resources.url(targetLocation)) { "FXML not found for ${component.javaClass} in $targetLocation" }
}

您可以在 app.init() 中覆盖它,例如:

FX.fxmlLocator = { component, _ ->
    val targetLocation = "/fxml/${component.javaClass.simpleName}.fxml"
    requireNotNull(component.resources.url(targetLocation)) { "FXML not found for ${component.javaClass} in $targetLocation" }
}

但是,如果您走这条路,则必须注意您的 class 名称,因为不同包中的相同 class 名称会在 /fxml 中查找相同的资源。或者,更改实现以同时观察包名称。

我现在正在提交该功能,您明天可以使用 sonatype 的最新快照版本试用它。