上周我发布了一个关于切换阶段/场景的问题,有人建议我阅读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);
}
}
为什么我得到的错误是我?在我去之前,我正在踢自己没备份。但是学习经历的所有部分。
答案 0 :(得分:0)
LoginPageController controller = loader.<LoginPageController>getController();
由于类型擦除,将在字节码中转换为类似的东西:
Object temp = loader.getController();
LoginPageController controller = (LoginPageController) temp;
如果FXMLLoader
创建的控制器类型无法分配给LoginPageController
,则会发生ClassCastException
。
由于fx:controller
中LaserControllerAdminUi.fxml
属性的值为com.WesternAdvance.Lasercontroller.LaserControllerUI
而非com.WesternAdvance.Lasercontroller.LoginPageController
,因此会发生这种情况。