0

VBox の「テーブル化された」表現を必要とするプロジェクトに取り組んでいます。アプリケーションの階層レイアウトは、GridPane -> VBox (セルの 1 つ) -> VBoxes (異なるデータセットを重ねて表示) -> データです。2 つのシーンがあります。

シーン 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();

データが追加される前と後では、もう 1 つ必要な場合でも、常に 1 つの子が存在します...

String-Array を人為的に埋めて、すべてを addData to(String s) から Initialize(...) に移動すると、機能し、データは親 VBox に VBox として表示されます。

コントローラーのロードとシーンの変更は問題にならないため、メイン クラスは投稿しませんでした。

皆様、大変お世話になりました!:)

4

1 に答える 1