【问题标题】:JavaFX Controller loadingJavaFX 控制器加载
【发布时间】:2015-11-12 22:08:10
【问题描述】:

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

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();

controller 现在是 null

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

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

【问题讨论】:

  • 你大概是指loader,而不是fxmlLoader在对setLocation(...)的两次调用中。

标签: java javafx javafx-8 fxml fxmlloader


【解决方案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();

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

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

【讨论】:

  • 没有注意到文档中的static 关键字。非常感谢。 :) 我为此损失了很多时间。
  • 由于某种原因,我对这个类的警告被抑制了......在将它们重新打开后,它按你说的那样执行。谢谢。
  • 如果您从引用中调用静态方法,大多数 IDE 都会给您一个警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2021-08-17
  • 2016-05-30
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多