javafx 8-Kompatibilität Probleme - FXML statische Felder
Habe ich entwickelt, eine javafx-Anwendung, die funktioniert gut in jdk 7. Wenn ich versuche, führen Sie es in der java-8, erhalte ich die nachstehende Ausnahmen:
javafx.fxml.LoadException:
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2617)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2595)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3191)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3164)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3140)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3132)
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: Root cannot be null
at javafx.scene.Scene.<init>(Scene.java:364)
at javafx.scene.Scene.<init>(Scene.java:232)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:204)
at javafx.concurrent.EventHelper.fireEvent(EventHelper.java:219)
at javafx.concurrent.Task.fireEvent(Task.java:1357)
at javafx.concurrent.Task.setState(Task.java:720)
at javafx.concurrent.Task$TaskCallable$2.run(Task.java:1438)
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
at java.lang.Thread.run(Thread.java:744)
Fand ich heraus, der Grund HIERFÜR ist in der initialize-Methode der controller-Klasse bin ich nicht in der Lage, verwenden Sie die eingebaute Methoden in statische Komponente. (Zum Beispiel: staticMyTextField.setText() die Ursache für das problem in java 8, aber nicht in java 7). Ich bin nicht in der Lage, um herauszufinden, was dokumentiert in Bezug auf diese in der javafx-guides. Kann mir bitte jemand einige Ideen auf, warum dies zu einem Problem in Java 8? Und teilen auch Dokumente in Bezug auf diese wenn.
Entnehmen Sie bitte diesem link. Dies ist die Arbeit in JDK 7, aber nicht im jdk 8 stackoverflow.com/questions/8434787/..., die Sie bitte helfen?
InformationsquelleAutor Christopher_Daniel | 2014-04-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie Sie versuchen, zu injizieren eine
TextField
in einem statischen Feld. So etwas wieDiese offenbar arbeitete in JavaFX 2.2. Es funktioniert nicht in JavaFX 8. Da es keine offizielle Dokumentation, die jemals unterstützt, diese zu verwenden, es ist nicht wirklich verletzen, Abwärtskompatibilität, obwohl in fairness in der Dokumentation über genau das, was die
FXMLLoader
tut, ist ziemlich trauriges.Es nicht wirklich viel Sinn zu machen
@FXML
-injiziert Felder statisch. Beim laden einer FXML-Datei, schafft er neue Objekte für jedes der Elemente in der FXML-Datei. Eine neue controller-Instanz, die mit jedem AufrufFXMLLoader.load(...)
und die Felder in der controller - Instanz injiziert werden mit den entsprechenden Objekten erstellt, die für die FXML-Elemente. Also das injizierte Felder sind unbedingt speziell auf die controller-Instanz. Wenn Sie hatte eine statische injiziert Felder in der Steuerung, und Sie lud die gleichen FXML-Datei zweimal angezeigt und es zweimal in der UI, dann würden Sie keine Möglichkeit haben, verweisen auf beide Gruppen von Steuerelementen.Update: Antwort auf Frage in den Kommentaren
Insbesondere nicht die Verwendung statischer Felder nur, um Ihnen zu ermöglichen, zugänglich von außerhalb der Klasse. Eine statische Feld einen einzigen Wert, der die Zugehörigkeit zu der Klasse, statt einen Wert für jede Instanz der Klasse, und die Entscheidung zu treffen, statische Felder sollten nur gemacht werden, wenn das Sinn macht. In anderen Worten,
static
definiert Umfang, nicht Zugänglichkeit. Zugriff auf Instanz-Daten, Sie müssen nur einen Verweis auf die Instanz. DieFXMLLoader
hat einegetController()
Methode, die es ermöglicht das abrufen einer Referenz auf den controller.Einem verwandten Punkt: es ist auch nicht eine gute Idee, setzen Sie die Steuerelemente der Benutzeroberfläche von der Steuereinheit. Sie sollten stattdessen setzen der Daten. Zum Beispiel, anstatt zu definieren, die eine
getTextField()
Methode im controller, stattdessen definieren Sie einetextProperty()
Methode gibt eineStringProperty
, den Inhalt derTextField
. Der Grund für dieses ist, dass, wenn Ihr Chef kommt ins Büro und sagt, er will dieTextField
ersetzt werden durch eineTextArea
oder eineComboBox<String>
oder einige andere Steuern, dann ist es viel härter, wenn Klassen außerhalb des Controllers sind mit IhremTextField
. Die Struktur der Daten dargestellt, die von Ihrem controller ist viel weniger wahrscheinlich zu ändern, als die Umsetzung, wie diese Daten dem Benutzer präsentiert wird.Einige Beispiele
+1 für die gute Erklärung. Ich dachte immer, statischer Sinn in diesen Situationen. Sie konnte immer noch statischen so spät wie 8b109. Dies ist über die 5. Frage, die ich gesehen habe, auf diesen so weit, aber nie eine Erklärung des 'warum nicht static'.
InformationsquelleAutor James_D