Guten abend, ich habe mal wieder ein Problem bei der Programmierung in JavaFx.
Ich stelle in einer Liste (ListView) den Inhalt von Objekten dar. Damit ich die Liste dynamisch erweitern/verkürzen kann verwende ich ListCells, die aus einer FXML-Datei die Darstellung laden.
Dabei bin ich quasi diesem Tutorial gefolgt:
Die Liste wird auch angezeigt und ist schön dynamisch, allerdings funktioniert ein in der FXML-Datei definierter Button jetzt nicht mehr, da er den Inhalt des Nodes, in dem die ListView angezeigt wird, verändern soll. Auf diesen kann er allerdings nicht zugreifen, da er den Controller dieses Nodes nicht kennt.
Bisher habe ich das Problem so gelöst, wie ich das auf verschiedenen Seiten gelesen habe: Man zieht den Child-Controller aus dem FXML-Loader und ruft eine setParentController()-Methode darin auf. Da aber bei der Erzeugung der ListCells der FXML-Loader im Controller der ListCell selbst sitzt hat der von da aus keinen Zugriff auf den Controller des Parents.
Außerdem habe ich irgendwie im Hinterkopf, dass die oben genannte Lösung eigentlich nicht schön und "Best Practice" ist, sondern es eine bessere gibt. Diese fällt mir allerdings nicht mehr ein und es kann auch sein, dass ich mich irre, aber das wäre eine zweite Frage, nämlich wie man am besten die Navigation in einer JavaFx-Anwendung gestaltet, wenn nur der Inhalt eines Nodes geändert werden soll, und zwar wenn ein Child dieses Nodes ein Event feuert. Hier nochmal Code-Brocken um das Problem zu verdeutlichen:
Normalerweise löse ich das so:
Jetzt wie es mit der ListView funktioniert:
Ich stelle in einer Liste (ListView) den Inhalt von Objekten dar. Damit ich die Liste dynamisch erweitern/verkürzen kann verwende ich ListCells, die aus einer FXML-Datei die Darstellung laden.
Dabei bin ich quasi diesem Tutorial gefolgt:

Custom ListCell in a JavaFX ListView
Create an custom ListCell for the ListView in JavaFX. Create an cell with own Icons/Pictures/Buttons and fill it with your data.
www.turais.de
Bisher habe ich das Problem so gelöst, wie ich das auf verschiedenen Seiten gelesen habe: Man zieht den Child-Controller aus dem FXML-Loader und ruft eine setParentController()-Methode darin auf. Da aber bei der Erzeugung der ListCells der FXML-Loader im Controller der ListCell selbst sitzt hat der von da aus keinen Zugriff auf den Controller des Parents.
Außerdem habe ich irgendwie im Hinterkopf, dass die oben genannte Lösung eigentlich nicht schön und "Best Practice" ist, sondern es eine bessere gibt. Diese fällt mir allerdings nicht mehr ein und es kann auch sein, dass ich mich irre, aber das wäre eine zweite Frage, nämlich wie man am besten die Navigation in einer JavaFx-Anwendung gestaltet, wenn nur der Inhalt eines Nodes geändert werden soll, und zwar wenn ein Child dieses Nodes ein Event feuert. Hier nochmal Code-Brocken um das Problem zu verdeutlichen:
Normalerweise löse ich das so:
Java:
class ParentController{
...
void showStuff(){
...
ChildController childC = loader.getController();
childC.setParentC(this);
}
void showOtherStuff(){ ... }
Java:
class ChildController{
...
void setParentC(ParentController parentC){ ... }
void onAction(){
parentC.showOtherStuff();
}
}
Jetzt wie es mit der ListView funktioniert:
Java:
class ParentController{
...
void init(){
ObservableList list = FXCollections.observableList(contentList);
listView.setItems(list); // -> hier würde ich ja sonst den ParentController weitergeben
}
void showOtherStuff(){ ... }
}
Java:
class CellController extends ListCell<CustomObject> {
...
@Override
protected void updateItem(CustomObject item, boolean empty){
super.updateItem(item, empty);
FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("./fxml/list_cell_view.fxml"));
loader.setController(this);
try {
loader.load(); // stattdessen wird hier geladen, wo ich keinen Zugriff auf den ParentController habe
} catch (IOException e) {
//Exception handling
}
details.setOnAction(e -> changeParentView());
}
private void changeParentView(){
// parentC.showOtherStuff(); -> geht nicht mangels Referenz auf parentC
}
}