JavaFX Auf den Controller einer ListCell zugreifen

@SupressWarnings()

Aktives Mitglied
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:
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
  }
}
 

mihe7

Top Contributor
Normalerweise löse ich das so:
Und was hindert Dich daran, es hier ebenso zu lösen?

Java:
    listView.setCellFactory(v -> {
        CellController c = new CellController();
        c.setParentController(this);
        return c;
    });
oder, sofern Du dem CellController einen entsprechenden Konstruktor spendierst:
Java:
    listView.setCellFactory(v -> new CellController(this));
}
 
X

Xyz1

Gast
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
Müsstest Du jetzt abgleichen, ist ein längerer Artikel (aber sicherlich wissen die Erfinder (oder "technischen Schreiber") auch etwas darüber):

 

@SupressWarnings()

Aktives Mitglied
Und was hindert Dich daran, es hier ebenso zu lösen?

Java:
    listView.setCellFactory(v -> {
        CellController c = new CellController();
        c.setParentController(this);
        return c;
    });
oder, sofern Du dem CellController einen entsprechenden Konstruktor spendierst:
Java:
    listView.setCellFactory(v -> new CellController(this));
}
Danke, das funktioniert. Hatte das bisher aber nicht so gesehen, sondern nur wie die CellFactory in einer eigenen Klasse definiert wird und dann über FXML-Code der ListView hinzugefügt.

Müsstest Du jetzt abgleichen, ist ein längerer Artikel (aber sicherlich wissen die Erfinder (oder "technischen Schreiber") auch etwas darüber):
Danke, habe ich mal überflogen, es scheint nicht so, dass da was drüber steht. Da geht es ja eigentlich nur um package-Names, MVC, CSS und Threading.
 

dzim

Top Contributor
Nur so zur Info: Wenn man FXMLs in FXMLs verschachtelt, kann man den child-Controller vom parent aus direkt per @FXML-Injection ansprechen. Dann ihm im #initialize den Parent reinreichen ist kein Problem. Ob das eine gute Idee ist, lasse ich jetzt jedoch mal einfach im Raum stehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
R Fxml findet controller nicht AWT, Swing, JavaFX & SWT 2
_user_q Objekte vom MainController in anderen Controller verwenden und andersherum (NullPointerException) AWT, Swing, JavaFX & SWT 14
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
I JavaFX - Pane wechseln über 2. Controller AWT, Swing, JavaFX & SWT 5
S JavaFX Fehler zwischen View und Controller bei MouseEvent (MVC) AWT, Swing, JavaFX & SWT 13
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
W Daten von Controller zu Controller übertragen AWT, Swing, JavaFX & SWT 7
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
OSchriever Auf Stage von FXML-Controller zugreifen AWT, Swing, JavaFX & SWT 12
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
J Injection - Aber Controller sind null AWT, Swing, JavaFX & SWT 3
J Controller ist null - Warum AWT, Swing, JavaFX & SWT 3
L Javafx Controller Klasse in Maven AWT, Swing, JavaFX & SWT 7
M NullPointerException / Controller AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX Daten zwischen Controller "austauschen" AWT, Swing, JavaFX & SWT 65
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
R JavaFX Übergabe von Parametern an Controller AWT, Swing, JavaFX & SWT 7
J Controller wird zu groß, was tun ? AWT, Swing, JavaFX & SWT 5
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 29
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 0
F JavaFX ListView füllen in Controller Class AWT, Swing, JavaFX & SWT 12
L JavaFX Zugriff auf HostServices im FXML Controller AWT, Swing, JavaFX & SWT 1
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
L Wie realisiere ich einen Controller AWT, Swing, JavaFX & SWT 1
M Java FX SceneBuilder 2.0, FXML, Controller AWT, Swing, JavaFX & SWT 1
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
I JavaFX Im Controller die ProgressBar mit Task updaten AWT, Swing, JavaFX & SWT 6
A JavaFX Von Klasse auf Controller Inhalt zugreifen AWT, Swing, JavaFX & SWT 9
KrokoDiehl JavaFX Gleiche Controller-Instanz für inludiertes FXML AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Class saveFile AWT, Swing, JavaFX & SWT 2
X JavaFX getScene().getWindow() im JavaFX Controller AWT, Swing, JavaFX & SWT 1
D JavaFX Gesetzte Variable in einem Controller im Controller laden AWT, Swing, JavaFX & SWT 1
L JavaFX Verständnisfrage zu JavaFX FXML und Controller-Klasse AWT, Swing, JavaFX & SWT 1
Z JAVAFX Stage über Controller weitergeben um css-file zu laden AWT, Swing, JavaFX & SWT 4
D JavaFX Controller Klasse splitten? AWT, Swing, JavaFX & SWT 16
C JavaFX Controller class AWT, Swing, JavaFX & SWT 2
M Java FX Daten an Controller übergeben AWT, Swing, JavaFX & SWT 3
D JavaFX Zugriff auf Controller erlangen AWT, Swing, JavaFX & SWT 4
B mouseOnEntered ( Controller richtig implementieren) AWT, Swing, JavaFX & SWT 4
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
G Swing MVC / View - Controller AWT, Swing, JavaFX & SWT 7
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
F Element anzeigen / erstellen. Maus vs Controller AWT, Swing, JavaFX & SWT 7
J Swing MVC mit Java Swing, insbesondere die Controller-Struktur AWT, Swing, JavaFX & SWT 4
A Controller für RCP AWT, Swing, JavaFX & SWT 2
J Swing Controller im MVC-Pattern AWT, Swing, JavaFX & SWT 9
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
D Design - View & Controller AWT, Swing, JavaFX & SWT 2
R Checkboxen - Event mit Controller abfangen AWT, Swing, JavaFX & SWT 7
P Verbindung View und Controller AWT, Swing, JavaFX & SWT 3
F MVC --> was ist der Controller? AWT, Swing, JavaFX & SWT 2
F MVC: Update von View und Controller AWT, Swing, JavaFX & SWT 5
S MVC - Neues Frame, neue View, neuer Controller? AWT, Swing, JavaFX & SWT 3
C Model View Controller - Beispielimplementation AWT, Swing, JavaFX & SWT 5
M SWT und Model View Controller? AWT, Swing, JavaFX & SWT 8
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben