我将尝试使用JavaFX 2并使用一个简单的演示应用程序。 该项目包含3个文件,Main.java,Controller.java和sample.fxml。
在Sample.fxml中,我声明了控制器:
<GridPane fx:controller="sample.Controller"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>
在我的Main.java中,我尝试访问控制器
FXMLLoader loader = new FXMLLoader();
Parent root = loader.load(getClass().getResource("sample.fxml"));
System.out.println(loader.getController()); //prints always null
所以我的第一个想法是映射不起作用。所以我在控制器中添加了一个初始化方法。
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
System.out.println("init");
}
输出现在是:
初始化
空
所以现在我的问题是如何访问给定fxml文件的控制器?
答案 0 :(得分:3)
FXMLLoader.load(URL)
方法是一种静态方法。所以当你执行
FXMLLoader loader = new FXMLLoader();
Parent root = loader.load(getClass().getResource("sample.fxml"));
您没有从您构建的FXMLLoader实例加载FXML文件(&#34; loader&#34;)。 (您实际上是通过对象引用调用静态方法。)因此,加载器的控制器永远不会被初始化。
你需要
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = loader.load();
这构造了一个指定了位置的加载器,然后在FXMLLoader实例上正确调用了load()
方法,该方法不是静态方法。然后
System.out.println(loader.getController());
会给出正确的结果。
答案 1 :(得分:2)
除了James_D的回答,我建议使用fx:root构造。然后,您可以使用@FXML注释将自定义控件(由控制器实现)注入另一个控制器。