2013-10-09 8 views
6

Was passiert, wenn ich FXMLLoader # load() in JavaFX aufruft?Wie lädt FXMLLoader den FXML-Controller?

Angenommen, der FXML Controller eine Klasse erweitert, die einen Konstruktor hat. Wird es Gewissheit geben, dass der Konstruktor aufgerufen wird? Und wenn nicht, wie wird eine neue Instanz des Objekts erstellt? Wird der TextField() -Konstruktor in dem folgenden Code beispielsweise aufgerufen?

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TextField; 
public class FXMLController extends TextField implements Initializable { 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

    }  
} 

Ich habe bereits versucht, diese eine Suche aus, aber es scheint, um es beiseite keine Dokumentation zu sein, von „eine Objekthierarchie von einem FXML Dokument Lasten.“ http://docs.oracle.com/javafx/2/api/javafx/fxml/FXMLLoader.html von

Ihre Antworten werden geschätzt. Danke vielmals!

Antwort

13

Um Ihre Frage zu beantworten: „Was einen FXMLLoader tut genau das tun, wenn ein Controller bauen?“:

zuerst wird es versuchen, eine Controller-Instanz zu erhalten:

  • wenn es bereits eine Reihe Controller-Instanz ist Auf dem FXMLLoader wird diese Instanz verwendet.
  • , wenn es keine Controller Fabrik auf dem FXMLLoader gesetzt ist, versucht er, ein Null-Argument-Konstruktor der Klasse pro Reflexion zu nennen. Wenn dies fehlschlägt, wird eine InstantiationException ausgelöst.
  • Wenn eine Controller-Factory eingestellt ist, wird diese Factory aufgerufen, um eine neue Controller-Instanz zu erstellen.

nach der Controller-Instanz erhalten, wird es mit ihr folgendes tun:

  • wenn diese Klasse initialisierbare implementiert, ruft sie public void initialize (URL url, Resourceresource). Wenn nicht, sieht es aus, ob es eine Methode namens initialize mit null Argumenten gibt und diese über Reflektion aufruft. Wenn nicht, tut es nichts.
+0

Wow. Danke für die schnelle Antwort. Der Prozess klingt interessant. Möchtest du mich deine Quelle wissen lassen? –

+0

Sie können dieses Verhalten ziemlich leicht testen und Sie können es auch in dem Quellcode sehen, der auf openjdk – Sebastian

+0

Thanks verfügbar ist. Ich könnte Openjdk überprüfen. –

1

Ich bin nicht ganz sicher, was Sie versuchen, die Steuerung sollte zu tun, aber in der Regel nicht ein Textfeld erweitern.

Abgesehen davon ist dies grundlegende Java-Zeug: Textfeld hat einen leeren Konstruktor, Ihr Controller hat keine, so Java wird (standardmäßig) den leeren Konstruktor in TextField aufrufen. Der TextField-Konstruktor wird standardmäßig (auch wenn er nicht im Code enthalten ist) den Konstruktor der Klasse, die er erweitert, usw. aufrufen. Es gibt keine Möglichkeit, ein Objekt in Java zu konstruieren, ohne dass ein Konstruktor aufgerufen wird.

+0

Große, vielen Dank für die prompte Antwort. Ich denke, es könnte so etwas wie ein Textfeld geben, das Steuerelemente steuern kann. –