2017-12-14 8 views
1

Ich habe ein Projekt in der Schule, wo ich ein Programm entwickeln muss, wo man zuerst wählen kann, ob man in einer SQL DB speichern/lesen/von/zu XML lesen/lesen will.JavaFX FXMLLoader getController NullPointerException

Ich habe eine GUI gemacht, wo Sie zwischen beiden Methoden wählen können.

Die GUI wird geschlossen, nachdem der Benutzer auf eine der Schaltflächen geklickt hat und die MainMenu-GUI geöffnet wird. Nun muss ich in der MainMenuController wissen, was der Benutzer wählen. Ich habe online eine Methode gefunden, die MainMenuController im ersten Controller mit FXMLLoader.getController() aufrufen.

try {      
    Stage stage = new Stage(); 
    FXMLLoader Loader = new FXMLLoader(); 
    Parent root = Loader.load(getClass().getResource("MainMenu.fxml")); 

    MainMenuController mc = Loader.getController(); 
    mc.setSave("sql"); 

    Scene scene = new Scene(root); 
    stage.setScene(scene); 
    stage.show(); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

MainMenuController

public class MainMenuController { 
    private String save = null; 

    public void setSave(String save) { 
     this.save=save; 
    } 
    public String getSave() { 
     return save; 
    } 
} 

Aber wenn ich versuche, eine Methode in MainMenuController zuzugreifen bekomme ich ein NullPointerException für

mc.setSave("sql") 

Antwort

0

Erstens, dieses Problem zu verstehen, sollten Sie ein paar Tricks machen zu erkennen, wo Ihre problem.When ist Sie tun:

System.out.println(mc); 

Sie das Ergebnis finden null ist .So Sie nicht setSave("sql") mit null obj aufrufen ect, Sie haben einen Null-Controller, weil Sie nicht den Speicherort Ihrer Datei angegeben haben, aber Sie können einige Zeilen ändern, um Ihr Problem zu lösen:

try { 
      Stage stage = new Stage(); 
      FXMLLoader fxm = new FXMLLoader(getClass().getResource("MainMenu.fxml")); 

      Parent parent = (Parent) fxm.load(); 
      Scene scene = new Scene(parent); 
      stage.setScene(scene); 
      stage.show(); 
      FirstController mc = fxm.getController(); 
      System.out.println(mc); 
      mc.setSave("sql"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+1

Vielen Dank. :) – bad

1

Sie die FXMLLoader.load(URL)statische Methode aufrufen. Da es sich um eine statische Methode handelt, hat dies keine Auswirkungen auf den Status der FXMLLoader Instanz, die Sie erstellt haben. speziell das Controllerfeld ist nicht gesetzt.

Stattdessen legen die Position auf der FXMLLoader Instanz, und rufen Sie die Instanz Methode load():

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource("MainMenu.fxml")); 
// or just FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenu.fxml")); 

Parent root = loader.load(); 
+0

danke. Jetzt funktioniert es einfach perfekt :) – bad

Verwandte Themen