我有一个 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"
定义其 Controller ,并且 Controller 本身包含一个文本字段 textFieldUsername
。
@FXML
protected TextField textFieldUsername;
然后,有第二个表单 AuxForm.fxml
和另一个 Controller fx:controller="AuxController"
。第二种表单包含在 MainForm.fxml
中,如下所示:
<content>
<fx:include source="AuxForm.fxml" />
</content>
现在我需要获取textFieldUsername
的值。第二个 Controller 需要这个值,但我不知道如何做到这一点。我的第一个想法是 public class AuxController extends MainController
以使所有控件可用,但这不起作用。
最佳答案
将 fx:id
添加到 fx:include
:
<content>
<fx:include fx:id="auxForm" source="AuxForm.fxml" />
</content>
现在您可以将所包含的 fxml 的 Controller (“嵌套 Controller ”)注入(inject)到“主 Controller ”中。假设 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
的值,以形成“嵌套 Controller ”的字段名称。
现在您可以在 AuxController
中定义您需要的任何方法(例如 public String getUsername() {...}
),并在需要时从主 Controller 调用它们.
例如,如果您需要向 AuxController
提供数据,您可以在那里提供一个属性,您可以从 MainController
设置或绑定(bind)该属性:
public class AuxController {
private final StringProperty username ;
public StringProperty usernameProperty() {
return username ;
}
//...
}
然后在主 Controller 的initialize()
方法中你可以这样做
auxFormController.usernameProperty().bind(
textFieldUsername.textProperty());
现在username.get()
将为您提供文本字段中的文本。
请参阅FXML documentation了解更多详情。
关于javafx - 在 JavaFX 8 中使用来自另一个表单/ Controller 的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36728775/