![](/img/trans.png)
[英]JavaFX FXML scene switching is not working [NullPointerException]
[英]JavaFX NullPointerException with fxml
我正在为我的程序创建一个基本的登录窗口,如果程序没有给我一个“NullPointerException”错误,我似乎无法切换场景。 代码:
public class Controller {
@FXML
private javafx.scene.control.TextField usernameTextField, passwordTextField;
@FXML
private Label loginFailed;
public static void main(String[] args) {
}
@FXML
private void verifyLogin() throws IOException { // Verifying the both the username, and password exists in the database
Configure obj = new Configure();
Main obj1 = new Main();
String username = usernameTextField.getText();
String password = passwordTextField.getText();
try {
Scanner scanner = new Scanner(obj.file);
//now read the file line by line...
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if(line.contains(username) && line.contains(password)) {
System.out.println("Half Way");
obj1.switchScenes("userHomescreen.fxml");
System.out.println("True");
return;
}
}
} catch(FileNotFoundException e) {
System.out.println("ERROR! File not found!");
}
loginFailed.setText("Wrong Username or Wrong Password!");
}
}
这是第一个场景的控制器类。 我的程序链接到一个文件,我正在使用扫描仪类并检查密码和用户名。
@FXML Button loginButton
void switchScenes(String sceneName) throws IOException {
Scene scene = loginButton.getScene();
Window window = scene.getWindow();
Stage stage = (Stage) window;
Parent primaryStage = FXMLLoader.load(getClass().getResource(sceneName));
Scene primaryScene = new Scene(primaryStage);
stage.setScene(primaryScene);
stage.show();
}
这就是我用来切换场景的方法,登录按钮是第一个场景上的按钮,我使用它是为了获取第一个场景,然后从中获取窗口。
最后,这是 fxml 代码:
<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<columnConstraints>
<ColumnConstraints />
</columnConstraints>
<rowConstraints>
<RowConstraints />
</rowConstraints>
<children>
<Pane fx:id="loginPane" prefHeight="540.0" prefWidth="395.0">
<children>
<Label layoutX="22.0" layoutY="91.0" text="Username:" />
<Label layoutX="22.0" layoutY="178.0" text="Password" />
<TextField fx:id="usernameTextField" layoutX="22.0" layoutY="122.0" prefHeight="25.0" prefWidth="351.0" />
<TextField fx:id="passwordTextField" layoutX="22.0" layoutY="204.0" prefHeight="25.0" prefWidth="351.0" />
<Button fx:id="loginButton" layoutX="22.0" layoutY="271.0" mnemonicParsing="false" onAction="#verifyLogin" prefHeight="25.0" prefWidth="130.0" text="Login" />
<Label fx:id="loginFailed" layoutX="25.0" layoutY="240.0" prefHeight="17.0" prefWidth="351.0" />
</children></Pane>
</children>
</GridPane>
所以回到我的问题,请帮助我理解并修复 switchScenes 方法中发生的 NullPointer 错误。 非常感谢!
就像@James_D 说的,问题是——
FXMLLoader 初始化控制器中带有@FXML 注释的字段。 您不是在控制器上调用 switchScenes(...),而是在您创建的其他对象上调用它。 因此 loginButton 未初始化并且仍然为空。 - 詹姆斯_D
所以我只是将 swtichScene 方法移到 Controller 类中,并且它起作用了。
试试下面的代码:
public void switchScenes(String sceneName){
try {
Stage stage = loginButton.getScene().getWindow();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource(sceneName));
Parent root = loader.load();
Scene primaryScene = new Scene(root);
stage.setScene(primaryScene);
} catch (IOException ex) {
JOptionPane.showMessageDialog(null, "Failed to Open Scene");
ex.getCause();
}
}
注意:字符串sceneName应该是“/PackageName/FXMLfile.fxml”
PackageName 之前的“/”很重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.