Fehlersuche und Laufzeitgrenzen
Zunächst die Anwendung außerhalb des Designers bauen und starten. So lassen sich Laufzeit-, Injection- und FXML-Probleme von Fehlern der Editor-Projektion trennen. Die Bibliothek ist ein Entwicklungssnapshot; einzelne Fehler haben noch keine vereinheitlichte Diagnose.
| Beobachtung | Prüfung |
|---|---|
| fx-SNAPSHOT oder Parent nicht auflösbar | Reactor lokal installieren; beide Projekte müssen dasselbe lokale Maven-Repository verwenden |
No plugin found for prefix 'javafx' |
Ziel nur am Anwendungs-POM ausführen, nicht mit -am am Library-Parent |
| JavaFX-/Native-Fehler | JDK, Architektur und tatsächlich aufgelöste Plattformartefakte prüfen; Versionen nicht mischen |
| getResource liefert null | Paketpfad, Großschreibung und Kopie nach target/classes kontrollieren |
| Maven meldet Erfolg trotz fehlender Funktion | Surefire-XML prüfen; der Parent ignoriert Testfehler |
| Modulstart scheitert, Classpath funktioniert | requires/opens und Service-Registrierung am tatsächlichen Module-Path-Start prüfen |
| Meldung oder Symptom | Bedeutung |
|---|---|
No control ... |
Binding-Ziel hat keine passende fx:id |
No property ... |
Öffentliche nameProperty()-Methode fehlt |
did not return a property |
Zielmethode liefert keine Property |
No read-write attribute for path ... |
Attribut/Pfad ungeeignet; Getter und Setter prüfen |
Not a direction: |
Expliziter Wert ist nicht view/model/both |
| NullPointerException bei Richtung | Richtung wurde möglicherweise ausgelassen; kein Default vorhanden |
Not a binding element: |
BindingList enthält einen unbekannten Deklarationstyp |
Not a converter: oder No converter |
Klasse fehlt beziehungsweise implementiert Converter nicht |
No computed method ... |
Öffentliche parameterlose Controller-Methode fehlt |
No controller for |
Computed hat keinen geeigneten Controller |
Could not call |
Computed-Aufruf warf eine Exception; Ursache ansehen |
No constructor taking the Model on ... |
Gewähltes ViewModel hat keinen passenden Ein-Argument-Konstruktor |
ViewModel is ... but the View names ... |
Spätere View verlangt einen zur bestehenden Instanz inkompatiblen Typ |
View is bound to ... |
getViewModel auf einem Ersatzobjekt ohne ViewModel-Basisklasse; property verwenden |
No component document |
ClassName.fxml fehlt neben der Component-Klasse |
No model property on |
modelProperty-Methode fehlt |
modelProperty did not return a property |
Model-Methode liefert ungeeigneten Typ |
| Node besitzt bereits einen Parent | Derselbe Component-Singleton wurde in unabhängigen Views wiederverwendet |
Die Root-Node einer geladenen View muss Parent sein. FXML-Fehler werden außerdem durch den FXMLLoader mit ihrer Ursache gemeldet. Unbekannte Component-Eigenschaften oder nicht konvertierbare Attribute sind keine still ignorierten Designer-Metadaten.
| Meldung | Ursache |
|---|---|
No collection ... |
Fehlende oder nicht als ObservableList verfügbare Collection |
A table needs a column |
Keine Column deklariert |
A column needs a header and an attribute |
Pflichtangabe fehlt oder Header ist leer |
Attribute ... is used twice |
Doppelte Column für ein Attribut |
Attribute ... is not a simple value |
Komplexes Attribut als Column verwendet |
Column ... needs a positive width |
Breite ist nicht positiv und endlich |
No row ... |
Row-Klasse fehlt |
Row is not a node: |
Row hat ungeeigneten Basistyp |
Für Repeat muss das Ziel eine Pane sein. Collection-Pfade sind keine allgemeine punktierte Pfadauflösung wie DirectBinding; eine direkte Property des aktuellen ViewModels verwenden. Collections vor dem Laden initialisieren. Die Injection-Diagnose erklärt, warum eine vorhandene Klasse trotzdem nicht vom Kontext erzeugt werden kann.
Ein direkt aufgerufener Model-Setter wird nicht beobachtet. Eine nicht beobachtbare alte Listenreferenz sendet keine JavaFX-Listenereignisse. Ein ausgetauschtes Zwischenobjekt verbindet einen bestehenden punktierten Pfad nicht neu. Eine Component bindet sich nur beim ersten nicht-null Model. Permutationen und reine Collection-Update-Ereignisse sind nicht implementiert. Diese Fälle benötigen eine passende Aktualisierung über Properties beziehungsweise einen neu aufgebauten View-/Component-Lebenszyklus.
Die Runtime ist kein transaktionales Formularsystem: Ein Binding schreibt unmittelbar. Eigene Entwürfe, fachliche Validierung, Persistenz und Abbrechen/Rollback liegen in der Anwendung. Table ist nicht virtualisiert. Der globale Model-Cache besitzt keine öffentliche Freigabe, und LoadedView kein Unbind-all. Lang laufende Anwendungen und viele kurzlebige Fenster müssen diese Lebensdauergrenzen ausdrücklich berücksichtigen.