JavaFx 如何为自定义 gui 生成器设置 FXML 加载器



我在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"));
}

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

那么,我该怎么办呢?我们什么时候使用fx:root,为什么?(我用谷歌搜索了它并检查了其他 SO 条目,但我仍然不清楚)。对我的问题的任何建议以及有关fx:root的一些示例的清晰解释将不胜感激。

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

编辑:按照@fabian的建议更改了java类,我之前实际上尝试过 并得到我上面提到的此错误。

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

最新更新