首页 文章

JavaFX:动态添加的VBox没有显示出来

提问于
浏览
0

我正在开发一个需要VBoxes“表格”表示的项目 . 我的应用程序的分层布局是GridPane - > VBox(在其中一个单元格中) - > VBoxes(在彼此之上显示不同的数据集) - >数据 . 我有两个场景 .

数据显示在场景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(...),它确实有效,数据在parent-VBox中显示为VBox .

我没有发布主类,因为加载控制器和场景更改不是问题 .

非常感谢大家的帮助! :)

1 回答

  • 0

    只是为了提供更详细的信息以及一个我不知道如何实现的想法 .

    这是我的主要课程:

    @Override
    public void start(Stage primaryStage) {
      currentStage = primaryStage;
      Parent root = FXMLLoader.load(getClass().getResource("Scene1.fxml"));
      scene1 = new Scene(root);
    }
    

    我可以在此时加载控制器并制作一个通过控制器的吸气剂吗?所以我在整个程序中只有一个单独的实例 .

    我试过插入:

    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.load(getClass().getResource("Scene1.fxml").openStream());
    Controller controller = (Controller) fxmlLoader.getController();
    

    之后

    Parent root ...
    

    线 . 但那是两次加载.xml文件 . 我怎样才能很好地连接这两个部分?

    非常感谢你的耐心等待!

    编辑:::::::::以下代码对我有用:

    @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 并且它总是传递该单个实例 .

    感谢您指点我正确的方向! :)

相关问题