如何访问 JavaFx 2.0 中的 Controller 类?

Posted

技术标签:

【中文标题】如何访问 JavaFx 2.0 中的 Controller 类?【英文标题】:How can I access a Controller class in JavaFx 2.0? 【发布时间】:2012-05-01 16:46:50 【问题描述】:

最近我在用JavaFx2.0编写一个软件,但遇到了一个大问题,那就是——我怎样才能访问一个Controller类? 对于具有相同类类型的每个控制器类,由于它所依赖的模型,它们的行为可能会有所不同,所以我想得到 视图的Controller类并为其提供指定的模型,我可以这样做吗? 我尝试通过 FXMLLoader 获取控制器,但是 getController() 方法返回 null!为什么?

1.LightView.java

FXMLLoader loader = new FXMLLoader();
anchorPane = loader.load(LightView.class.getResource(fxmlFile));//fxmlFile = "LightView.fxml"
//controller = (LightViewController) loader.getController();//fail to get controller!it is null
//I want to -> controller.setLight(light);

2.LightView.fxml

<AnchorPane ... fx:controller="light.LightViewController" >

3.LightViewController.java

....
private Light light;
public void initialize(URL arg0, ResourceBundle arg1)

4.Light.java

.... a simple pojo

所以,我想做的是为每个 LightViewController 提供一个指定的灯光对象(它们来自一个列表)。 谁能帮助我?非常感谢!

【问题讨论】:

也许这个答案会有所帮助:http://***.com/a/10108788/682495. JavaFX 2.0 + FXML. Updating scene values from a different Task的可能重复 【参考方案1】:

我使用以下:

URL location = getClass().getResource("MyController.fxml");

FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());

Parent root = (Parent) fxmlLoader.load(location.openStream());

这样fxmlLoader.getController()就不是null

【讨论】:

非常感谢!你的方法正是我需要的!再次感谢! @yinger090807 你可以accept answers 这很有帮助(这里似乎就是这种情况) 我有一种情况,fxmlLoader.getController() 不是这样工作的。但我不知道为什么!【参考方案2】:

除了 Alf 的回答,我想指出,代码可以更短:

URL location = getClass().getResource("MyController.fxml");

FXMLLoader fxmlLoader = new FXMLLoader();

Parent root = (Parent) fxmlLoader.load(location.openStream());

这也有效。

【讨论】:

【参考方案3】:

请改用getResourceAsStream

anchorPane = loader.load(LightView.class.getResourceAsStream(fxmlFile));

很简单,很好用。

【讨论】:

【参考方案4】:

你可以试试这个……

    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("LightView.fxml"));
    loader.load();
    Parent parent = loader.getRoot();
    Scene Scene = new Scene(parent);
    Stage Stage = new Stage();
    LightViewController lv = loader.getController();
    lv.setLight(light);
    Stage.setScene(Scene);
    Stage.show();

【讨论】:

以上是关于如何访问 JavaFx 2.0 中的 Controller 类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaFX 2.0 中创建和显示通用对话框(错误、警告、确认)?

javafx 场景生成器 2.0 中的文件选择器在哪里?我找不到它

JavaFX 2.0 像 MenuItem 一样激活菜单

如何从 JavaFX 中的另一个控制器类访问 UI 元素?

如何在我的应用程序的javafx 2.0中更改阶段标题栏上的图标[重复]

JavaFX 2.0 - 样式/模板现有控件