簡體   English   中英

JavaFX:動態添加的VBox不會顯示

[英]JavaFX: Dynamically added VBox does not show up

我正在一個需要VBoxes的“表格”表示形式的項目中。 我對應用程序的分層布局是GridPane-> VBox(在一個單元中)-> VBoxes(在彼此之上顯示不同的數據集)->數據。 我有兩個場景。

數據顯示在場景1上。用戶可以通過表單並單擊場景2上的按鈕來添加數據。然后,添加的數據應再次作為場景1的父VBox內的VBox顯示在現有數據下方。

這是清楚的代碼:

我的Scene 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>

我的Scene 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包含的元素比標簽更多,但是在這種情況下與我似乎無關。

我的Scene 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();

在添加數據之前和之后,它始終只有一個孩子,即使應該再有一個孩子...

如果我人為填充字符串數組並將所有內容從addData移到(String s)到Initialize(...),它將起作用,並且數據在父VBox中顯示為VBoxes。

我沒有發布主課程,因為加載控制器和場景更改不是問題。

非常感謝大家的幫助! :)

為了提供更詳細的信息以及一個我不知道如何實現的想法。

這是我的主要課程:

@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並且它始終會傳遞該單個實例。

感謝您為我指明正確的方向! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM