我将尝试使用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
所以我的第一个想法是映射不起作用。因此,我在控制器中添加了一个initialize方法。
@Override public void initialize(URL url, ResourceBundle resourceBundle) { System.out.println("init"); }
现在的输出是:
在里面 空值
在里面
空值
所以我现在的问题是如何访问给定fxml文件的控制器?
该FXMLLoader.load(URL)方法是静态方法。所以当你执行
FXMLLoader.load(URL)
FXMLLoader loader = new FXMLLoader(); Parent root = loader.load(getClass().getResource("sample.fxml"));
您不是从构造的FXMLLoader实例(“ loader”)中加载FXML文件。(实际上,您是通过对象引用调用静态方法的。)因此,加载程序的控制器永远不会初始化。
你需要
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); Parent root = loader.load();
这将使用指定的位置构造一个加载器,然后load()在FXMLLoader实例上正确调用该方法(不是静态方法)。然后
load()
System.out.println(loader.getController());
会给出正确的结果。