1

每次忘记诀窍时,我都会遇到一些非常奇怪的行为。

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/window.fxml"));
Parent root = loader.load();
GuiController controller = loader.getController();

现在controller不为空。

然而,在我这样做之后......

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/window.fxml"));
Parent root = loader.load(getClass().getResource("view/window.fxml"));
GuiController controller = loader.getController();

现在controllernull

我知道loader他不知何故失去了对位置的控制?我非常感谢有人告诉我这是一种预期的行为并解释我为什么。

请注意,在关于这个问题的帖子之后没有发现任何东西,并且在 2 小时的实验后才发现解决方案,所以请不要将我与类似的问题联系起来。

4

1 回答 1

1

FXMLLoader方法load(URL)就是static方法。所以你的第二个代码块相当于(编译为)

FXMLLoader loader = new FXMLLoader();
// I assume you mean loader, not fxmlLoader, in the next line:
loader.setLocation(getClass().getResource("view/window.fxml"));
Parent root = FXMLLoader.load(getClass().getResource("view/window.fxml"));
GuiController controller = loader.getController();

换句话说,您永远不会调用load(...)on loader: 因此loader永远不会解析 FXML 并且永远不会实例化控制器。

在您的第一个代码块中,您调用无参数load()方法,它是一个实例方法。

于 2015-11-12T22:19:20.347 回答