2016-05-16 11 views
1

Ich versuche, auf eine Instanz der Controller-Klasse für das Fenster zuzugreifen, das die fxml lädt. Es lädt ohne Fehler, aber wenn ich versuche, die Anzahl der Konten druckenfxmlLoader.getController() führt zu Nullzeigerausnahme?

System.out.println("from NAW: "+ NAC.newAccModel.users.getNumAccs()); 

mit ihm unterhalb der Nullpointer Ausnahme geben. (Linie 36 ist die println)

java.lang.NullPointerException 
at muselogin.newAccountWindow.<init>(newAccountWindow.java:36) 
at muselogin.MuseLoginController.initialize(MuseLoginController.java:84) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) 
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) 
at muselogin.MuseLogin.start(MuseLogin.java:22) 
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
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.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Thread.java:745) 

hier ist, wo ich versuche, die getController()

public class newAccountWindow extends Application { 



    Stage stage = new Stage(); 
    newAccountController NAC = new newAccountController(); 

public newAccountWindow(){ 
    Parent root=null; 
    try{ 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("newAccountWindow.fxml")); 
    root = fxmlLoader.load(getClass().getResource("newAccountWindow.fxml")); 
    // fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory()); 
    NAC = (newAccountController) fxmlLoader.getController(); 
    System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs()); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    Scene scene = new Scene(root); 
    //scene.getStylesheets().add(MuseLogin.class.getResource("newAccCSS.css").toExternalForm());   
    stage.setScene(scene); 
} 

hier zu nennen ist die Steuerung, wenn es

public class newAccountController implements Initializable { 

    newAccountModel newAccModel; 

    @FXML 
    private TextField usernameField; 
    @FXML 
    private PasswordField passwordField; 
    @FXML 
    private Button createAccount; 
    @FXML 
    private PasswordField confirmField; 
    @FXML 
    private Label usernameBlankMessage; 
    @FXML 
    private Label usernameTakenMessage; 
    @FXML 
    private Label passwordMessage; 


    //counter to check if all 3 conditions are met 
    int makeAcc = 0; 

    //action event for make account button clicked 
    @FXML 
    private void createAccountClicked(ActionEvent event) { 

     //does account creation stuff 

    } 

    public int getNumAccs(){ 
     return newAccModel.users.getNumAccs(); 
    } 

    //required initialize function, initializes model 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     newAccModel = new newAccountModel(); 

    } 

} 
+0

Was macht der Konstruktor für die 'newAccountModel()'? Sie stellen keinen Code dafür zur Verfügung. Verbindet es Benutzer mit einem 'newAccountModel' und speichert eine Referenz im' user'-Member von 'newAccountModel'? Wenn dies nicht der Fall ist, ist dies wahrscheinlich die Quelle Ihrer NullPointerException: 'users' ist null, daher gibt' users.getItems() 'eine NullPointerException aus. Siehe: [Was ist eine Nullzeiger-Ausnahme und wie behebe ich sie?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i) -fix-it) Bitte folgen Sie den [Namenskonventionen für Klassen] (http://www.iwombat.com/standards/JavaStyleGuide.html). – jewelsea

Antwort

0

Angelegenheiten eine URL zu vorbei die load Methode verwenden Sie eine der staticload Methoden von FXMLLoader, die den Controller natürlich nicht in Ihrer FXMLLoader Instanz speichern kann, da keine Informationen über die Instanz verfügbar sind.

Da Sie bereits die URL im FXMLLoader Konstruktor angeben, einfach die anstelle parameterlos load Methode verwenden:

root = fxmlLoader.load(); 
+0

Das funktionierte wie ein Charme! Warum würde eine zweite Deklaration der URL dazu führen, dass ein Null-Controller zurückgegeben wird? – Chase

+0

@Chase: Das Schreiben von 'fxmlLoader.load (url);' hat den gleichen Effekt wie das Schreiben von 'FXMLLoader.load (url)'. Da diese Lademethode "statisch" ist, sind keine Informationen verfügbar, die es der Methode ermöglichen würden, die von ihr erstellte Controller-Instanz der (nicht) verwendeten 'FXMLLoader'-Instanz zuzuordnen. Wenn Sie wie der Controller auf Eigenschaften des 'FXMLLoader' zugreifen wollen (vorausgesetzt, er wird während des Ladens erstellt), müssen Sie eine der nicht-statischen 'load' Methoden verwenden. – fabian

0
NAC = (newAccountController) fxmlLoader.getController(); 
System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs()); 

Sie können nicht die sysout nach dem getController zu tun. Was Sie tun, ist, dass Sie die newAccModel in der Controller initilize Methode erstellen oder initialisieren. initialize nahm irgendwann, um Anruf zu bekommen. Es wird aufgerufen, wenn der Ladevorgang abgeschlossen ist. aber

NAC = (newAccountController) fxmlLoader.getController(); 

nach dieser Zeile war Last nicht bereit. so gibt es einfach NPE. Bitte stellen Sie sicher, dass Sie Zugriff auf die newAccModel nach der Initialisierungsmethode in der Steuerung ausgeführt