嵌入 FXML 中的访问操作
Access actions in embed FXML
我的应用程序的结构大致是这样的MainApplication->SuperFXMLController->ChildFXMLController。每个 ChildFXML 都有一个按钮,用于向 SuperFXML 中的 GridPane 添加一个子元素 我已经在 ChildFXMLController 中定义了 buttonHandler 方法,但操作本身应该发生在 SuperFXMLController 中(在网格中添加新行)。问题是如何处理来自 SuperFXMLController 的动作?
这里有一些代码细节:
AddLogRecordController.java(所谓"SuperFXMLController"):
@FXML
private void initialize() throws IOException {
rowIndex = 0;
FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));
mainGrid.add(loader.load(), 0, rowIndex++);
RecordGridController controller = (RecordGridController) loader.getController();
controller.setSuperController(this);
}
...
public void addRowHandle() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));
mainGrid.getChildren().add(loader.load());
RecordGridController controller = loader.getController();
} catch (IOException e) {
e.printStackTrace();
}
}
"RecordGridController" 简称为 "ChildFXMLController":
private AddLogRecordController superController;
...
public void setSuperController(AddLogRecordController addLogRecordControllerClass) {
this.superController = addLogRecordControllerClass;
}
...
@FXML
private void addRowHandler() {
superController.addRowHandle();
}
这是结果 window,其中红色包围的部分是子 fxml,应在按下添加到 QSO 按钮时复制多次:
好的,现在我按照计划去做了。我在 SuperController 中添加了以下方法:
private void loadRecordGrid(int rowIndex) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));
mainGrid.add(loader.load(), 0, rowIndex);
RecordGridController controller = (RecordGridController) loader.getController();
controller.initialize(this);
} catch (IOException e) {
e.printStackTrace();
}
}
然后像这样初始化方法:
@FXML
private void initialize() {
rowIndex = 0;
loadRecordGrid(rowIndex++);
}
像这样的 addRowHandler 方法:
public void addRowHandle() {
loadRecordGrid(rowIndex++);
}
在子控制器中:
private AddLogRecordController superController;
@FXML
public void initialize(AddLogRecordController superController) {
this.superController = superController;
}
@FXML
private void addRowHandler() {
superController.addRowHandle();
}
不知道,也许可以用更有效的方法来完成,但目前可行。
现在我需要弄清楚如何将文本字段的值从 child 传递到 parent 并返回
我的应用程序的结构大致是这样的MainApplication->SuperFXMLController->ChildFXMLController。每个 ChildFXML 都有一个按钮,用于向 SuperFXML 中的 GridPane 添加一个子元素 我已经在 ChildFXMLController 中定义了 buttonHandler 方法,但操作本身应该发生在 SuperFXMLController 中(在网格中添加新行)。问题是如何处理来自 SuperFXMLController 的动作?
这里有一些代码细节: AddLogRecordController.java(所谓"SuperFXMLController"):
@FXML
private void initialize() throws IOException {
rowIndex = 0;
FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));
mainGrid.add(loader.load(), 0, rowIndex++);
RecordGridController controller = (RecordGridController) loader.getController();
controller.setSuperController(this);
}
...
public void addRowHandle() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));
mainGrid.getChildren().add(loader.load());
RecordGridController controller = loader.getController();
} catch (IOException e) {
e.printStackTrace();
}
}
"RecordGridController" 简称为 "ChildFXMLController":
private AddLogRecordController superController;
...
public void setSuperController(AddLogRecordController addLogRecordControllerClass) {
this.superController = addLogRecordControllerClass;
}
...
@FXML
private void addRowHandler() {
superController.addRowHandle();
}
这是结果 window,其中红色包围的部分是子 fxml,应在按下添加到 QSO 按钮时复制多次:
好的,现在我按照计划去做了。我在 SuperController 中添加了以下方法:
private void loadRecordGrid(int rowIndex) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));
mainGrid.add(loader.load(), 0, rowIndex);
RecordGridController controller = (RecordGridController) loader.getController();
controller.initialize(this);
} catch (IOException e) {
e.printStackTrace();
}
}
然后像这样初始化方法:
@FXML
private void initialize() {
rowIndex = 0;
loadRecordGrid(rowIndex++);
}
像这样的 addRowHandler 方法:
public void addRowHandle() {
loadRecordGrid(rowIndex++);
}
在子控制器中:
private AddLogRecordController superController;
@FXML
public void initialize(AddLogRecordController superController) {
this.superController = superController;
}
@FXML
private void addRowHandler() {
superController.addRowHandle();
}
不知道,也许可以用更有效的方法来完成,但目前可行。 现在我需要弄清楚如何将文本字段的值从 child 传递到 parent 并返回