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

时间:2015-11-22 16:50:48

标签: java javafx controller fxml

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

String foo = "Foo.";

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

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

如何使foo的值显示为按钮上的文字?我应该在哪里存储它,控制器或其他地方?我仍然对主文件,控制器和FXML文件如何完全融合在一起感到困惑。

2 个答案:

答案 0 :(得分:4)

你需要为按钮定义一个ID(在场景构建器中或只是每手,通过添加fx:id =&#34; yourId&#34;标记)。

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

@FXML
private Button yourId;

现在,您可以在示例yourId.setText(foo);

中访问Button以调用所需的相应方法

如果要从例如AccessClass的实例访问在您的Application类中,您可以执行以下操作:

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

答案 1 :(得分:2)

您可以让控制器通过注入访问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);
    }
}

回答&#34;所有这些如何结合在一起&#34;您的问题的一部分,将FXML和控制器视为一对。 FXML定义布局,而控制器定义逻辑(处理用户输入等)。控制器可以使用上述机制访问FXML文件中定义的UI元素。

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

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