【问题标题】:How to interact with an FXML form in JavaFX? [duplicate]如何与 JavaFX 中的 FXML 表单进行交互? [复制]
【发布时间】:2014-06-15 16:51:37
【问题描述】:

考虑到this example 如何从主代码获取或设置表单上的任何内容?

我们只有一个简单的 Main 函数,比如

@Override
public void start(Stage stage) throws Exception {
  Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"));

  Scene scene = new Scene(root, 300, 275);

  stage.setTitle("FXML Welcome");
  stage.setScene(scene);
  stage.show();
}

在 FXML 中定义的表单。

还有一个从未显式实例化的控制器类。

由于我在主代码中没有指向控制器类实例的链接,我如何从控制器外部访问表单上的任何内容?

【问题讨论】:

    标签: java javafx-2


    【解决方案1】:

    您可以做的一件事是为控制器创建一个默认构造函数,并将this 存储到一个私有静态变量中。然后,您可以为该变量创建一个静态 getter 以检索控制器实例。然后,您可以直接公开 @FXML-annotated 字段或为它们提供 getter 方法。如果你加载同一个控制器的多个实例,这会中断,原因很明显。

    不过,我对 JavaFX 没有太多经验,所以我不能确定这是一个好还是坏的解决方案……我只知道它适用于更简单的情况。

    编辑:这个答案有更好的解决方案:Accessing FXML controller class

    基本上:

    FXMLLoader fxmlLoader = new FXMLLoader();
    Pane p = fxmlLoader.load(getClass().getResource("foo.fxml").openStream());
    FooController fooController = (FooController) fxmlLoader.getController();
    

    【讨论】:

    • 不要使用静态变量来暴露控制器中的数据。控制器数据本质上是非静态的,因为它特定于控制器实例。
    • 是的,我意识到...只要您小心地最多只加载该 FXML 文件一次,它就可以工作,在那种情况下它很方便,但它绝对不会如果您有同一个控制器的多个实例,则可以工作。
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多