我正在开发一个需要VBoxes“表格”表示的项目。我的应用程序的分层布局是GridPane - > VBox(在其中一个细胞中) - > VBox(在彼此之上显示不同的数据集) - >数据。我有两个场景。
数据显示在场景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中的添加数据按钮时,触发的方法将输入的数据传递给场景1的控制器。这是因为新数据现在应该显示在场景1中。
我觉得逻辑不起作用(在这里编辑),因为当我要求
时System.out.println(parentBox.getChildren().size();
在添加数据之前和之后,它总是只有一个Child,即使它还应该有一个......
如果我人工填充String-Array并将所有内容从addData移动到(String s)到Initialize(...),它确实有效,数据在父VBox中显示为VBox。
我没有发布主类,因为加载控制器和场景更改不是问题。
非常感谢你的帮助! :)
答案 0 :(得分:0)
仅提供更详细的信息以及一个我不知道如何实施的想法。
这是我的主要课程:
@Override
public void start(Stage primaryStage) {
currentStage = primaryStage;
Parent root = FXMLLoader.load(getClass().getResource("Scene1.fxml"));
scene1 = new Scene(root);
}
我可以在此时加载控制器并制作一个通过控制器的getter吗?所以我在整个程序中只有一个单独的实例。
我尝试插入:
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.load(getClass().getResource("Scene1.fxml").openStream());
Controller controller = (Controller) fxmlLoader.getController();
之后
Parent root ...
线。但那是两次加载.xml文件。我怎样才能很好地连接两个部分?
非常感谢你的耐心!
EDIT ::::::::: 以下代码对我有用:
@Override
public void start(Stage primaryStage) {
currentStage = primaryStage;
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Scene1.fxml"));
Parent root =(Parent) fxmlLoader.load();
controller = (Controller) fxmlLoader.getController();
}
现在,我可以向主类询问controller
,它总是传递那个单一实例。
感谢您指点我正确的方向! :)