使用JavaFX 8中另一个表单/控制器的控件

时间:2016-04-19 20:27:16

标签: javafx javafx-8

我有一个JavaFX 8应用程序......

MainApp.java

    Parent root;
    root = FXMLLoader.load(getClass().getResource("/fxml/MainForm.fxml"));
    Scene scene = new Scene(root);        
    stage.setScene(scene);
    stage.show();

MainForm.fxml使用fx:controller="MainController"定义其控制器,控制器本身包含文本字段textFieldUsername

@FXML
protected TextField textFieldUsername;

然后,第二种形式AuxForm.fxml与另一个控制器fx:controller="AuxController"。第二种形式包含在MainForm.fxml中,如下所示:

<content>
  <fx:include source="AuxForm.fxml" />
</content>

现在我需要获得textFieldUsername的值。第二个控制器需要此值,但我不知道如何执行此操作。我的第一个想法是public class AuxController extends MainController让所有控件都可用,但这不起作用。

1 个答案:

答案 0 :(得分:2)

fx:id添加到fx:include

<content>
  <fx:include fx:id="auxForm" source="AuxForm.fxml" />
</content>

现在,您可以将包含的fxml(“嵌套控制器”)的控制器注入“主控制器”。假设AuxForm.fxmlfx:controller="AuxController",您可以这样做:

public class MainController {

    @FXML
    private AuxController auxFormController ;


    public void initialize() {
        // call any methods you need on auxFormController ...

        // ...
    }

    // ...
}

此处的规则是您将单词Controller附加到fx:id的值,以形成“嵌套控制器”的字段名称。

现在,您可以在AuxController中定义所需的任何方法(例如public String getUsername() {...}),并在需要时从主控制器调用它们。

例如,如果您需要向AuxController提供数据,则可以在那里提供一个属性,您可以在MainController设置或绑定该属性:

public class AuxController {

     private final StringProperty username ;

    public StringProperty usernameProperty() {
        return username ;
    }

    //...
}

然后在主控制器的initialize()方法中你可以做

auxFormController.usernameProperty().bind(
    textFieldUsername.textProperty());

现在username.get()会在文本字段中显示文字。

有关详细信息,请参阅FXML documentation