Die Person-Desk-Referenzanwendung
fx-example verbindet FX und Injection in einer lauffähigen Anwendung. Eine Person besitzt Namen, Alter, Aktivstatus, Rolle, eine Heimatadresse mit Notiz, Besuche, ausgewählten Besuch und Tags. Die Anwendung dient als Referenz für ein echtes Formular; der Schnellstart bleibt der kleinere Einstieg.
Aus dem NeitzelLib-Root mit JDK 21:
./mvnw -pl fx-example -am install
./mvnw -f fx-example/pom.xml javafx:run
Nach package beziehungsweise install funktioniert auch:
java -jar fx-example/target/fx-example-1.0-SNAPSHOT.jar
Das benachbarte target/libs muss erhalten bleiben: Der Manifest-Classpath verweist darauf. Das Beispiel ist eine Classpath-Anwendung ohne module-info. Für Tests und Start ist eine grafische Sitzung nötig. Der Parent ignoriert Surefire-Fehler; XML-Berichte wie im Schnellstart prüfen.
Java-Code liegt unter src/main/java/de/neitzel/fx/example/, FXML unter src/main/resources/de/neitzel/fx/example/view/ innerhalb des Moduls.
| Datei beziehungsweise Typ | Aufgabe |
|---|---|
| Main | Einfacher Application-Launcher |
| DeskApp | Scan-Konfiguration, frisches Beispiel-Model, Loader, Scene und Popup-Registrierung |
| model/Person, Address, Note, Role | JavaBeans und Enum ohne JavaFX-Pflicht |
| view/DeskController und Desk.fxml | Ereignisse, Computed-Begrüßung, Controls und Bindings |
| view/PersonViewModel | Handgeschriebene Unterklasse mit abgeleitetem title |
| view/AddressForm | Heimatadresse, injizierte Überschrift und innere NoteForm |
| view/NoteForm | Verschachtelte Notiz-Component |
| view/VisitForm | Frisches Formular je wiederholtem Besuch |
| view/VisitRow | Table-Row mit drei editierbaren Feldern und Remove-Button |
| view/AgeConverter, StreetConverter, VisitedOnConverter | Textumwandlung, Prüfung und ISO-Datum |
| Testressource NameLine.fxml | Zweite einfache View desselben Models ohne wiederverwendete Component-Nodes |
AgeSuffix, StreetPolicy und FormHeading liegen ebenfalls im view-Paket. Ihre Verwendung zeigt die drei Injection-Arten. Die zweite Testressource liegt konkret unter src/test/resources/de/neitzel/fx/example/NameLine.fxml.
- Name ändern: Model, Echo, title und Computed-Begrüßung folgen. Das Draft-Feld verwendet
model; eigene Änderungen schreiben zurück, spätere Änderungen anderer Controls überschreiben seinen Text nicht. - Age mit dem Format
years 36bearbeiten. Ungültiger Text bleibt sichtbar und der letzte Model-Wert erhalten; eine Nachricht beschreibt den Fehler. Eine gültige Eingabe beseitigt diesen Conversion-Fehler. - Heimatstraße bearbeiten. Das Pfad-Label folgt. Eine leere Straße scheitert an StreetPolicy; die Nachricht erreicht Person unter
home.street. - Notiz bearbeiten. Die innere NoteForm schreibt
Note.text.Opened as ...hält dagegen den initialen Setup-Wert fest, statt jede spätere Stadtänderung zu verfolgen. - Einen Visit hinzufügen. Repeat und Table ergänzen denselben Eintrag. Änderungen einer Street sind in den anderen Darstellungen derselben Address sichtbar. Remove delegiert an den Controller.
- Einen Visit in ComboBox oder Table auswählen. Beide verwenden
selectedVisit. Sortierung und Filter verändern die angezeigten Zeilen, nicht die Reihenfolge der Model-Liste. - Datum als
yyyy-MM-ddbearbeiten und Tags ergänzen. Ein ungültiges Datum lässt den bisherigen Wert bestehen; Tags zeigen die gemeinsame ObservableList einfacher Werte. - INFO-, WARN- und FATAL-Buttons verwenden. Fatal beendet das Programm nicht. Popups sind nicht blockierend und lassen sich mit OK schließen.
Ein direkter Bean-Setter nach dem Laden benachrichtigt Controls nicht. Die gezeigten Aktionen arbeiten über ViewModel-Properties oder ObservableLists.
src/test/java/de/neitzel/fx/example/DeskLoadsTest.java lädt das echte FXML. Die neun Tests prüfen Anfangswerte, alle Richtungen, abgeleiteten und berechneten Text, Fehler und Wiederherstellung der Converter, Kindnachrichten, Table-Bearbeitung/Entfernen, Nachrichten sowie Boolean-/Enum-Rückschreibung. Außerdem prüfen sie die Wirkungslosigkeit direkter Bean-Setter auf bestehende Controls und die Wiederverwendung eines ViewModels in einer zweiten einfachen View.
./mvnw -pl fx-example -am clean verify
Das verändert keine installierten Maven-Artefakte. Die XML-Ergebnisse bleiben maßgeblich.
Im Repository-Root liegt neitzel-fx-designer.json mit Kontext person-desk. Es wählt fx-example, Classpath, das Profil designer-preview, den lokalen Runtime-Schlüssel java21 und DeskPreviewProvider. Maschinenpfade stehen in lokalen Einstellungen, nicht im gemeinsamen Kontext.
Nach Vorbereitung der Designer-Artefakte:
./mvnw -pl fx-example -am -Pdesigner-preview verify
Das optionale Profil fügt das Preview-API nur dem Test-Source-Set hinzu, kompiliert src/designer/java, übernimmt die Ressourcen und erzeugt Model-Metadaten für Person, Address und Note. Es ersetzt weder das handgeschriebene PersonViewModel noch erzeugt es eine Default-Registry. Ohne Profil hat die normale Anwendung keine Designer-Dependency.
Die Designer-Anleitung beschreibt Artefaktvorbereitung, lokale JDK-Zuordnung, Start und Build and Refresh. Die FXML-Dateien deklarieren ihr Model per neitzel-model-Processing-Instruction. Passende Samples heißen desk, address, visit, row und note. Jeder Preview-Aufruf erzeugt frische Models und einen eigenen Injection-Kontext ohne Nachrichten-Popups. Preview-Änderungen speichern keine Beispieldaten in den Quellcode.
Die Role-Werte werden in DeskController.initialize statt über ein anwendungsspezifisches Enum-fx:constant gesetzt, weil die derzeitige Designer-Projektion dieses Objekt nicht auflösen kann. Das ist keine Einschränkung gewöhnlicher NeitzelLib-/FXMLLoader-Anwendungen.