如何将数据从 Java 传递到 FXML?

How to pass data from Java to FXML?

在控制器中(或者可能是主文件或其他文件,我不确定这一切是如何工作的),我们有以下内容:

String foo = "Foo.";

在 Scene Bilder 生成的 FXML 中,是这样的:

<Button mnemonicParsing="false" prefHeight="25.0" prefWidth="61.0" text="Browse" />

如何使 foo 的值显示为按钮上的文本?我应该在哪里存储它,控制器还是其他地方?我仍然对主文件、控制器和 FXML 文件如何准确地组合在一起感到困惑。

您需要为按钮定义一个 ID(在场景构建器中或仅通过添加 fx:id="yourId" 标签)。

在您的控制器 class 中,您必须添加

@FXML
private Button yourId;

您现在可以访问按钮来调用您需要的相应方法,在您的示例中yourId.setText(foo);

如果你想访问 ControllerClass 的实例,例如您的应用程序 class,您可以执行以下操作:

FXMLLoader loader = new FXMLLoader(your_fxml_resource);
Parent parent = loader.load();
YourControllerClass controller = loader.getController();//add this line to get your controller instance.

您通过注入授予控制器访问 FXML 中定义的 UI 元素的权限。具体来说,在 FXML 中,给 UI 元素一个 fx:id 属性:

<Button fx:id="someButton" mnemonicParsing="false" prefHeight="25.0" prefWidth="61.0" text="Browse" />

现在在您的控制器中,定义一个带有 @FXML 注释的字段,其名称与 fx:id 属性值相匹配:

public class Controller {

    @FXML
    private Button someButton ;

}

现在您可以使用您需要的任何逻辑配置按钮:

public class Controller {

    @FXML
    private Button someButton ;

    public void initialize() {
        String foo = "foo" ;
        someButton.setText(foo);
    }
}

要回答问题的 "how does all this fit together" 部分,请将 FXML 和控制器视为一对。 FXML 定义布局,而控制器定义逻辑(处理用户输入等)。控制器可以使用上述机制访问 FXML 文件中定义的 UI 的元素。

FXMLLoader 加载 FXML 文件时,在默认设置中,FXMLLoader 创建控制器实例 class,注入 @FXML-注释字段进入控制器实例,并调用控制器实例的 initialize() 方法。

Application subclass 的存在只是您申请的起点。它通常只会加载一个 FXML 文件,将 FXML 的根放在 Scene 中,并在初级阶段显示 Scene。如果你有一个更复杂的应用程序,你也可以在这里启动一些服务和后台线程。