如何将数据从 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
。如果你有一个更复杂的应用程序,你也可以在这里启动一些服务和后台线程。
在控制器中(或者可能是主文件或其他文件,我不确定这一切是如何工作的),我们有以下内容:
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
。如果你有一个更复杂的应用程序,你也可以在这里启动一些服务和后台线程。