【问题标题】:Exception in Thread JavaFX application thread Cannot be castThread JavaFX 应用程序线程中的异常无法强制转换
【发布时间】:2016-11-17 08:49:34
【问题描述】:

上周我发布了一个关于切换阶段/场景的问题,有人建议我阅读 MVC 框架。我已经这样做了,并开始转换我的应用程序,现在当我尝试更改场景时出现错误。

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)

它所指的行是

 loader.<LoginPageController>getController();

这就是我正在做的......

我有一个登录页面loginPage.java,它创建了这样一个场景:

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();
  }
}

然后我有一个LoginPageController.java 来检查密码输入并将其与这样的哈希值进行比较:

 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");
          }
  }
}

然后根据哪个用户登录LoginManager.java 应该像这样打开正确的场景...

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);
        }
  }   

为什么会出现我现在的错误?我在踢自己,因为在我开始之前没有备份。但都是学习经历的一部分。

【问题讨论】:

    标签: java model-view-controller javafx


    【解决方案1】:
    LoginPageController controller = loader.<LoginPageController>getController();
    

    由于类型擦除,将在字节码中转换为类似这样的内容:

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

    如果FXMLLoader 创建的控制器类型不可分配给LoginPageController,则会发生ClassCastException

    由于LaserControllerAdminUi.fxmlfx:controller 属性的值是com.WesternAdvance.Lasercontroller.LaserControllerUI 而不是com.WesternAdvance.Lasercontroller.LoginPageController,因此会发生这种情况。

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2021-01-28
      相关资源
      最近更新 更多