2013-10-09 9 views
6

Cosa succede quando chiamo FXMLLoader # load() in JavaFX?In che modo FXMLLoader carica il controller FXML?

Supponiamo che il controller FXML estenda una classe che ha un costruttore. Ci sarà la certezza che il costruttore sarà chiamato? E se no, come verrà creata una nuova istanza dell'oggetto? Ad esempio, nel codice seguente, verrà chiamato il costruttore di TextField()?

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) { 

    }  
} 

ho già provato a cercare questo fuori, ma non sembra esserci alcuna documentazione su di esso parte da "Carica una gerarchia di oggetti da un documento FXML." da http://docs.oracle.com/javafx/2/api/javafx/fxml/FXMLLoader.html

sarà apprezzato le vostre risposte. Molte grazie!

risposta

13

per rispondere alla tua domanda "che cosa fa un FXMLLoader fare esattamente quando si costruisce un controllore?":

primo momento sarà cercare di ottenere un'istanza di controllo:

  • se esiste già un insieme istanza del controller su FXMLLoader, userà questa istanza.
  • se non c'è alcun controller impostato in fabbrica su FXMLLoader, tenta di chiamare un costruttore di argomento zero della classe per riflessione. Se fallisce, viene lanciata una InstantiationException.
  • se è stato impostato un controller, chiamerà questo factory per creare una nuova istanza controller.

dopo aver ottenuto l'istanza di controllo, si farà il seguente con esso:

  • se questa classe implementa Initializable, chiama inizializzazione public void (url URL, ResourceBundle ResourceBundle). In caso contrario, viene visualizzato se esiste un metodo chiamato initialize con argomenti zero e lo chiama tramite reflection. In caso contrario, non fa nulla.
+0

Wow. Grazie per la pronta risposta. Il processo sembra interessante. Vuoi farmi sapere la tua fonte? –

+0

Puoi testare questo comportamento abbastanza facilmente e puoi anche vederlo nel codice sorgente disponibile su openjdk – Sebastian

+0

Grazie. Potrei controllare openjdk. –

1

io non sono del tutto sicuro di quello che si sta cercando di fare, ma normalmente il controller non dovrebbe estendere un campo di testo.

A parte questo, si tratta di elementi di base di Java: il campo di testo ha un costruttore vuoto, il controller non ne ha nessuno, quindi java (per impostazione predefinita) chiamerà il costruttore vuoto disponibile in TextField. Il costruttore TextField per impostazione predefinita (anche se non è nel codice) chiama il costruttore della classe che estende e così via. Non c'è modo di costruire un oggetto in java senza che venga chiamato un costruttore.

+0

Grande, grazie per la risposta pronta. Sto pensando che potrebbe esserci qualcosa come un campo di testo in grado di controllare i controlli. –

Problemi correlati