我正在尝试以最有效的方式使用SceneBuilder切换场景,并且我注意到针对此特定实例并没有很多回答的问题。出于某种原因,当我尝试运行此代码序列时,我会遇到很长的错误:(此外,如果它有助于理解我在做什么,那么这是一种相当简单的照片加密设备,可以对密码进行加密,添加盐并存储其哈希值位于文本文件中)
Parent parent = FXMLLoader.load(getClass().getResource("password.fxml"));
Scene enterpasswordscene = new Scene(parent);
Stage window = (Stage) ((Node)event.getSource()).getScene().getWindow();
window.setScene(enterpasswordscene);
window.show();
相反,我决定使onStart类成为切换场景的方法持有者。在控制器类内部,我调用方法:onstart.showpasswordprompt();
,该方法如下所示:
public void showpasswordprompt() throws IOException(Inside Onstart Class){
FXMLLoader loader = new FXMLLoader();
loader.setLocation(OnStart.class.getResource("password.fxml"));
mainLayout = loader.load();
Scene scene = new Scene(mainLayout);
stage.setScene(scene);
stage.show();
}
但是,每当我调用该方法时都会出现此错误,它看起来像这样:
似乎FXML就是问题所在(第17行),但是错误指出“没有为顶层元素指定控制器”。尽管这很不寻常,因为在按下按钮时,我为按钮的OnAction方法指定了一个方法。方法如下:
@FXML
private void Createpassword(ActionEvent event) throws IOException {
passwordPlainText = passwordtextbox.getText();
System.out.println(passwordPlainText);
BufferedImage image = ImageIO.read(f);
// doAESEncryption(passwordPlainText);
}
这是FXML(仅兴趣线):
<TextField fx:id="passwordtextbox" layoutX="251.0" layoutY="184.0" promptText="Password" />
<Button fx:id="passwordenter" layoutX="438.0" layoutY="184.0" mnemonicParsing="false" onAction="#Createpassword" prefHeight="25.0" prefWidth="101.0" text="Enter" />
FXML的#Createpassword
部分以红色突出显示,但实际上我在主控制器类中创建了该方法。我的猜测是未调用#Createpassword
方法的原因是因为代码正在OnStart类而不是maincontroller方法中寻找该方法。但是,我认为不是这种情况,因为在maincontroller类中加载新场景也不起作用。有人可以告诉我为什么这不起作用吗?