使用JavaFX的应用程序,我有一个Main.fxml文件,其中包含一些fxml子文件。
我想从子控制器访问Main.fxml的MainController类。
我将尝试通过一个示例更好地解释:
MainFxml:
<HBox fx:controller="MainController.java">
<fx:include source="child.fxml"/>
</HBox>
主控制器:
public class MainController implements Initializable {
private String string;
public void setString (String string) {
this.string = string;
}
ChildFxml:
<HBox fx:id="child" fx:controller="ChildController.java">
<Button text="hello" onAction="#selectButton"></Button>
</HBox>
ChildController:
public class ChildController implements Initializable {
@FXML HBox child;
@FXML Button button;
@FXML
public void selectButton (ActionEvent event) {
// here call MainController.setString("hello");
}
我尝试了this solution found on StackOverflow,但是我需要获取已经加载的Main.fxml的Controller参考。
有什么方法可以让Controller从特定的窗格开始?
就像是:
// child.getParent().getController();
最佳答案
如果将fx:id
分配给<fx:include>
标记,则FXMLLoader
尝试将包含的fxml的控制器注入到名为<fx:id>Controller
的字段中。您可以通过MainController
方法将initialize
引用传递给子控制器:
<HBox fx:controller="MainController.java">
<fx:include fx:id="child" source="child.fxml"/>
</HBox>
主控制器
@FXML
private ChildController childController;
@Override
public void initialize(URL url, ResourceBundle rb) {
childController.setParentController(this);
}
子控制器
private MainController parentController;
public void setParentController(MainController parentController) {
this.parentController = parentController;
}
@FXML
private void selectButton (ActionEvent event) {
this.parentController.setString("hello");
}
但是,最好使
ChildController
与父代保持独立。这可以通过在StringProperty
中提供一个ChildController
设置为父项应显示的值来完成。子控制器
private final StringProperty value = new SimpleStringProperty();
public StringProperty valueProperty() {
return value;
}
@FXML
private void selectButton (ActionEvent event) {
value.set("hello");
}
ParentController
@Override
public void initialize(URL url, ResourceBundle rb) {
childController.valueProperty().addListener((observable, oldValue, newValue) -> setString(newValue));
}