Es scheint verdrahtet zu sein, ich würde denken, dass die Verwendung von FXML, um unsere benutzerdefinierten Komponenten zu schreiben, offensichtlich der richtige Weg ist.
Aber wie wir aus ControlsFX, JFXextras und sogar dem Buch 'Mastering JavaFX8 Controls sehen können, benutzen oder erwähnen sie nicht die Verwendung von FXML in benutzerdefinierten Steuerelementen.
Trotz dieser, die offizielle Dokumentation zu sagen, auf dieser Route zu gehen und JavaFX-Steuerelemente über FXML zu erstellen.
Was ist der richtige Weg und warum?
Es gibt zwei Arten von benutzerdefinierten Steuerelementen in JavaFX:
fx: rootbasierte benutzerdefinierte Steuerelemente : Diese benutzerdefinierten Steuerelemente sind stylefähig (CSS-Unterstützung), aber sind nicht skinable.
Wenn Sie ein Anwendungsentwickler sind, möchten Sie dies am besten verwenden der ganzen Zeit.
Diese Art von Steuerelementen ist normalerweise anwendungs- oder organisationsspezifisch. Zusätzliche benutzerdefinierte Skins für diese Steuerelemente werden nicht benötigt, CSS ist genug.
Normalerweise gruppieren sie einfach einige Steuerelemente zusammen und bieten eine schönere API und verstecken die Interna.
Sie sind viel einfacher zu schreiben als skinfähige benutzerdefinierte Steuerelemente.
Ich denke dabei an eine Alternative zu den JPanel-Unterklassen in der Swing-Welt.
Ich schlage vor, Ihre GUI in kleine zu zerlegen in sich geschlossene fx: wurzelbasierte Kontrollen (hohe Kohäsion, geringe Kopplung). Benutze die Mediator Muster zum Kombinieren dieser Steuerelemente (das übergeordnete Steuerelement verwaltet / konfiguriert seine untergeordneten Steuerelemente und überwacht die Ereignisse von sein Kind steuert. Die untergeordneten Steuerelemente kennen einander nicht.)
Sie können ganze Hierarchien solcher Steuerelemente erstellen. Bricht sie auf in kleinen Kontrollen erleichtert die Wartung (z.B. wenn das Layout oder die Benutzerinteraktion muss sich ändern).
skinfähige benutzerdefinierte Steuerelemente : Skinfähige benutzerdefinierte Steuerelemente sind nicht nur stylefähig (über CSS), sondern ihr Erscheinungsbild kann durch die Bereitstellung einer benutzerdefinierten Skin vollständig geändert werden.
Wenn Sie Entwickler einer Steuerelementbibliothek sind, dann möchten Sie höchstwahrscheinlich skinfähige benutzerdefinierte Steuerelemente bereitstellen, damit die Benutzer der Bibliothek JavaFX optimal nutzen können.
Diese Art von Steuerelementen sind normalerweise sehr einfache, hoch wiederverwendbare Steuerelemente und verwenden häufig (aber nicht immer) auch ein benutzerdefiniertes Bild.
Sie sind schwieriger zu korrigieren als fx: rootbasierte benutzerdefinierte Steuerelemente.
Es gibt keinen richtigen Weg. Aber wir können es auf den Punkt bringen:
Kennen Sie die Anzahl der JavaFX-Elemente, die vor dem Start Ihrer Anwendung angezeigt werden? Wenn ja, können Sie Ihre GUI mit SceneBuilder erstellen oder direkt in XML die FXML-Datei schreiben. Dies gilt für die meisten GUI-Bildschirm-Setups, bei denen das gesamte Layout (MenuBar, ToolBar, Inhalt, Seitenleiste, ...) gut bekannt ist und sich im Laufe der Zeit nicht ändert.
Jetzt wissen benutzerdefinierte Komponenten nicht, wie sie angezeigt werden sollen. Es gibt viele Optionen, die zu erfüllen sind, und die meisten benutzerdefinierten Komponenten werden dynamisch erstellt oder können sich drastisch ändern, wenn der Benutzer diese Optionen ändert. Sie können keine einzelne FXML-Datei schreiben, sondern müssten stattdessen viele einzelne Dateien schreiben, die jeweils einen kleinen Teil der benutzerdefinierten Komponente bilden. Das ist nicht wirklich praktisch zu verwalten, also entscheiden sich die meisten Entwickler dafür, es ohne FXML direkt im Code zu machen.
Und noch dazu: Es gibt viele benutzerdefinierte Komponenten, die ein spezielles Layout verwenden, das nicht in JavaFX integriert ist, um zu erreichen, dass Sie Ihre eigenen Container schreiben und sie mit benutzerdefinierten Komponenten verkabeln müssen, um das perfekte Ergebnis zu erhalten. Am Ende werden benutzerdefinierte Komponenten erstellt (oder besser: sollten erstellt werden), die in FXML / SceneBuilder verwendet werden.