我正在开发一个需要 VBoxes 的“表格”表示的项目。我的应用程序分层布局是 GridPane -> VBox(在其中一个单元格中)-> VBoxes(在彼此之上显示不同的数据集)-> Data。我有两个场景。
数据显示在场景 1 上。用户可以通过表单和单击场景 2 上的按钮添加数据。然后,添加的数据应该再次显示在现有数据的下方,作为场景 1 的父 VBox 内的 VBox。
这是清楚的代码:
我的场景 1 .fxml 文件如下所示(简化):
<GridPane fx:id="grid" fx:controller="application.Controller">
[here: ColumnConstraints]
<children>
<VBox fx:id="parentBox" GridPane.columnIndex="0" GridPane.rowIndex="1"/>
<Button fx:id="goToScene2" text="+" onAction="#goToScene2"/>
</children>
</GridPane>
场景 2 只有一个按钮和一个 TextField:
<GridPane fx:id="grid" fx:controller="application.AddDataController">
[here: ColumnConstraints]
<children>
<Button fx:id="addData" text="add" onAction="#bAddData"/>
<TextField fx:id="data"/>
</children>
</GridPane>
我的场景 1 控制器(控制器)如下所示:
public class Controller implements Initializable {
@FXML Button goToScene2;
@FXML VBox parentBox;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
public void addData(String s) {
Label lbl = new Label(s);
VBox dataBox = new VBox();
dataBox.setPadding(new Insets(15, 5, 15, 5));
dataBox.setSpacing(5);
dataBox.setMaxHeight(80);
dataBox.getChildren().add(lbl);
parentBox.getChildren().add(dataBox);
}
}
之所以这样设计,是因为 dataBox 包含的元素多于标签,但在这种情况下,这似乎与我无关。
我的场景 2 控制器 (addDataController) 如下所示:
@FXML Button addData;
@FXML TextField data;
@FXML protected void bAddData(){
String content = data.getText();
FXMLLoader fxmlLoader = new FXMLLoader();
Pane p = fxmlLoader.load(getClass().getResource("scn1.fxml").openStream());
Controller cont = (Controller) fxmlLoader.getController();
cont.addData(content);
}
因此,当在场景 2 中单击 Add-Data-Button 时,触发的方法会将输入的数据传递给场景 1 的控制器。这是因为新数据现在应该显示在场景 1 中。
我觉得逻辑不起作用(在此处编辑),因为当我要求
System.out.println(parentBox.getChildren().size();
在添加数据之前和之后,它总是只有一个 Child,即使它应该还有一个......
如果我人为地填充一个字符串数组并将所有内容从 addData 移动到(String s)到 Initialize(...),它确实可以工作并且数据在父 VBox 中显示为 VBox。
我没有发布主类,因为加载控制器和场景更改不是问题。
非常非常感谢大家的帮助!:)