我有一个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
让所有控件都可用,但这不起作用。
答案 0 :(得分:2)
将fx:id
添加到fx:include
:
<content>
<fx:include fx:id="auxForm" source="AuxForm.fxml" />
</content>
现在,您可以将包含的fxml(“嵌套控制器”)的控制器注入“主控制器”。假设AuxForm.fxml
有fx: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。