2017-10-14 18 views
0

Ich bin neu zu javafx vor kurzem, und ich lade fxml immer im Konstruktor der Controller-Klasse und verwende dann Komponenten direkt.JavaFX FXML-Konstruktor und Initialisierungsmethode

Ich habe gerade gelernt, dass die Komponenten nur zugegriffen werden kann, bevor initialize aufgerufen wurde.

Aber es ist sehr seltsam, auch wenn ich Komponente nur im Konstruktor verwende, gibt es keine Fehler auftreten. Mein Code sieht so aus.

@Override 
public void start(Stage primaryStage){ 

    new MainController(primaryStage,this); 
} 


public class MainController{ 
    @FXML 
    private ListView<HistoryPlay> historyLV; 
public MainController(Stage primaryStage, Main main) { 

     initFxml(); 
     initView(); 


} 
private void initFxml() { 
     FXMLLoader loader=new FXMLLoader(); 
     loader.setController(this); 
     try { 
      loader.setLocation(new File("fxml\\Main.fxml").toURL()); 
      loader.load(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 


    } 

private void initView() { 

     historyLV.setCellFactory(param -> new HistoryListCell(MainController.this,main)); 
     historyLV.setItems(main.getHistoryManager().getHistoryList()); 


    } 

} 

Es gibt keine Nullpunkt Ausnahme auftreten. Warum?

Antwort

1

public Alle Felder und nicht public Felder mit der @FXML Annotation mit Namen, die ein fx:id übereinstimmen vom FXMLLoader initialisiert werden in der zugewiesenen Controller-Klasse (mit FXMLLoader.setController(Object)), wenn die FXMLLoader.load() Methode aufgerufen wird.

So kann angenommen werden (da es in Ihrer Frage nicht enthalten ist), dass Sie ein ListView in Ihrer FXML-Datei Main.fxml mit fx:id="historyLV" haben. Deshalb erhalten Sie nicht NullPointerException.