我在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.
答案 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>