2016-04-06 7 views
0

Ich habe eine Haupt-GUI in fxml-Datei mit SceneBuilder und dem zugehörigen Controller erstellt. In dieser Hauptgui habe ich eine Gridpane, wo ich für jede Zelle drei Kind (ein Label, ein TextView und eine CheckBox) setzen möchte. Also habe ich eine zusätzliche fxml mit einer HBox als root und den drei Kindern erstellt.JavaFx enthalten mehrere GUI in der Haupt-GUI

Jetzt ... Wie könnte ich durch Code in der Gridpane der Hauptgui die definierte Komponente für jede Zelle hinzufügen und interagiert mit ihnen?

Ich meine ... was ich will ist in der Haupt gui Controller so etwas tun:

for (int i) for (int j) gridpane.add ("the_composed_view_in_the_other_fxml", i, j)

Antwort

1

Wenn ich Ihre Frage richtig verstanden habe, würden Sie so etwas wie dies in der initialize Methode der „main“ Controller tun:

public class MainController { 

    @FXML 
    private GridPane gridpane ; 

    public void initialize() throws IOException { 
     int numCols = ... ; 
     int numRows = ... ; 

     for (int rowIndex = 0 ; rowIndex < numRows ; rowIndex++) { 
      for (int colIndex = 0 ; colIndex < numCols ; colIndex++) { 
       FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/addtional/fxml")); 
       gridpane.add(loader.load(), colIndex, rowIndex); 
      } 
     } 
    } 
} 

Für „interagieren“ mit den Komponenten aus dem einem geladenen zusätzliche fxml-Datei, es liegt in der Verantwortung des Controllers für die zusätzliche fxml. Sie können einen Verweis auf jede dieser Steuerungen erhalten, nachdem Sie die fxml Datei laden:

gridpane.add(loader.load(), colIndex, rowIndex); 
AdditionalController controller = loader.getController(); 

und dann können Sie Methoden aufrufen, die Sie in diesem Controller-Klasse definiert haben. Sie haben nicht wirklich detailliert genug, zu wissen, was vorausgesetzt, Sie wollen vielleicht hier tun, aber, z.B .:

public class AdditionalController { 

    @FXML 
    private CheckBox checkBox ; 

    public BooleanProperty selectedProperty() { 
     return checkBox.selectedProperty(); 
    } 

    // etc... 
} 

und dann so etwas wie

gridpane.add(loader.load(), colIndex, rowIndex); 
AdditionalController controller = loader.getController(); 

String s = String.format("Item [%d, %d]", colIndex, rowIndex); 
controller.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> { 
    if (isNowSelected) { 
     // process selection... 
     System.out.println(s + " is selected"); 
    } 
}); 
Verwandte Themen