我在 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 类,我之前实际尝试过,并得到了上面提到的这个错误。
如果我没有在 fxml 文件中设置控制器,那么我会收到一个错误,因为我有一个需要设置控制器的按钮
不对。只要您FXMLLoader
在加载 fxml 之前设置了控制器实例,就不会有问题。
推荐的实现方式如下:
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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句