Skip to main content
Entwickler Themen
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

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.

Bauen und starten

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.

Die Dateien

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.

Verhalten nachvollziehen

  1. 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.
  2. Age mit dem Format years 36 bearbeiten. Ungültiger Text bleibt sichtbar und der letzte Model-Wert erhalten; eine Nachricht beschreibt den Fehler. Eine gültige Eingabe beseitigt diesen Conversion-Fehler.
  3. Heimatstraße bearbeiten. Das Pfad-Label folgt. Eine leere Straße scheitert an StreetPolicy; die Nachricht erreicht Person unter home.street.
  4. 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.
  5. 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.
  6. 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.
  7. Datum als yyyy-MM-dd bearbeiten und Tags ergänzen. Ein ungültiges Datum lässt den bisherigen Wert bestehen; Tags zeigen die gemeinsame ObservableList einfacher Werte.
  8. 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.

Automatisierte Prüfung

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.

Designer ergänzen

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.