2016-11-17 8 views
0

Letzte Woche habe ich eine Frage zum Wechseln von Phasen/Szenen gestellt und jemand schlägt vor, dass ich mich über MVC Framework erkundige. Ich habe das gemacht und habe angefangen, meine Anwendung zu konvertieren, und ich bekomme jetzt einen Fehler, wenn ich versuche, die Szene zu ändern.Ausnahme im Thread JavaFX-Anwendungsthread Kann nicht umgewandelt werden

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: com.WesternAdvance.Lasercontroller.LaserControllerUI cannot be cast to com.WesternAdvance.Lasercontroller.LoginPageController 
    at com.WesternAdvance.Lasercontroller.LoginManager.showMainViewAdmin(LoginManager.java:60) 

Die Linie es sich bezieht ist

loader.<LoginPageController>getController(); 

Hier ist, was ich tue ...

ich eine Login-Seite loginPage.java haben, die eine Szene wie diese erzeugt:

public class LoginPage extends Application { 
    public static void main(String[] args) { launch(args); } 
    @Override public void start(Stage stage) throws IOException { 
    Scene scene = new Scene(new StackPane()); 

    LoginManager loginManager = new LoginManager(scene); 
    loginManager.showLoginScreen(); 

    stage.setScene(scene); 
    stage.show(); 
    stage.setTitle("Laser Controller"); 
    stage.setOnCloseRequest(e -> System.exit(1)); 
    stage.setX(0); 
    stage.setY(0); 
    stage.sizeToScene(); 
    } 
} 

Dann habe ich eine LoginPageController.java, die die Passworteingabe überprüft und vergleicht s es auf einen Hash wie folgt aus:

public void initManager(final LoginManager loginManager) { 
    login.setOnAction(new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent event) { 
     String passwordhashadmin = "$2a$08$WV7EDELlZbLHqrcW5qpuSuc6Bk8PkpvttIqeBi1n0EwP.yLt.tg2K"; 
     String passwordhashuser = "$2a$08$2eS3Mukla5T.rCC747/hj.FGrP2GHSWCgloP4ZBVuTROYIQWwo6lm"; 

     if (BCrypt.checkpw(userId.getText() + passwordfield.getText(), passwordhashuser)) 

    { 

      loginManager.showMainViewUser();//Login as User 
    } 
     else if (BCrypt.checkpw(userId.getText() + passwordfield.getText(), passwordhashadmin)) 
    { 

      loginManager.showMainViewAdmin(); 
    } 


     else{ 
     errorMessage.setText("Login Incorrect!"); 
     System.out.print("false"); 
      } 
    } 
} 

Und je danach, auf dem Benutzer anmeldet LoginManager.java sollte die richtige Szene wie diese öffnen ...

void showMainViewUser() { 
    try { 
     FXMLLoader loader = new FXMLLoader(
     getClass().getResource("LaserControllerUserUi.fxml") 
    ); 
     scene.setRoot((Parent) loader.load()); 
     LoginPageController controller = 
       loader.<LoginPageController>getController(); 
     controller.initManager(this); 
     scene.getStylesheets().add(LaserControllerUI.class.getResource("LaserControllerUI.css").toExternalForm()); 

    } catch (IOException ex) { 
     Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 



void showMainViewAdmin() {  

    try { 
    FXMLLoader loader = new FXMLLoader(
      getClass().getResource("LaserControllerAdminUi.fxml") 
     ); 
      scene.setRoot((Parent) loader.load()); 
      LoginPageController controller = 
        loader.<LoginPageController>getController(); 
        controller.initManager(this); 
      scene.getStylesheets().add(LaserControllerUI.class.getResource("LaserControllerUI.css").toExternalForm()); 

     } catch (IOException ex) { 
      Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

Warum bin ich die Fehlermeldung bekommen, dass ich bin ? Ich trete mich selbst dafür, dass ich nicht zurückgehe, bevor ich daran gegangen bin. aber alles Teil der Lernerfahrung.

Antwort

0
LoginPageController controller = loader.<LoginPageController>getController(); 

Wird wegen Typ Löschung auf ein Äquivalent von so etwas wie dies in Bytecode umgewandelt werden:

Object temp = loader.getController(); 
LoginPageController controller = (LoginPageController) temp; 

Wenn der Controller-Typ, die von den FXMLLoader erstellt wird LoginPageController nicht belegbar ist ein ClassCastException geschieht .

Da der Wert des fx:controller Attributs in LaserControllerAdminUi.fxmlcom.WesternAdvance.Lasercontroller.LaserControllerUI und nicht com.WesternAdvance.Lasercontroller.LoginPageController ist, geschieht dies.

Verwandte Themen