gpt4 book ai didi

java - 尝试替换场景内容时 JavaFx 中的指针异常

转载 作者:太空宇宙 更新时间:2023-11-04 14:59:15 25 4
gpt4 key购买 nike

我刚刚启动 Java 并使用 Fx 获取一些 GUI,但在尝试替换场景内容时出现空指针异常。主要加载 Login.fxml 没有任何问题,但是当我单击切换到另一个 fxml 的按钮时,出现错误。

主要:

    package application;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;


public class Main extends Application {

private Stage stage;

@Override
public void start(Stage primaryStage) {
Parent root;
try {
root = FXMLLoader.load(getClass().getResource("Login.fxml"));
} catch (IOException e) {
e.printStackTrace();
return;
}
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.sizeToScene();
primaryStage.show();

}

public static void main(String[] args) {
launch(args);
}

private void gotoMainView() {
try {
MainViewController profile = (MainViewController) replaceSceneContent("MainView.fxml");
profile.setApp(this);
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}

void Userlogin()
{
gotoMainView();
}
private void gotoLogin() {
try {
LoginController login = (LoginController) replaceSceneContent("Login.fxml");
login.setApp(this);
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}

private Initializable replaceSceneContent(String fxml) throws Exception {
FXMLLoader loader = new FXMLLoader();
InputStream in = Main.class.getResourceAsStream(fxml);
loader.setBuilderFactory(new JavaFXBuilderFactory());
loader.setLocation(Main.class.getResource(fxml));
AnchorPane page;
try {
page = (AnchorPane) loader.load(in);
} finally {
in.close();
}
Scene scene = new Scene(page, 800, 600);
stage.setScene(scene);
stage.sizeToScene();
return (Initializable) loader.getController();
}



}

登录 Controller 类:

    package application;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class LoginController extends AnchorPane implements Initializable {
@FXML
static private Button btntext;
@FXML
static private TextField loginusr;
@FXML
static private PasswordField loginpwd;

private Main application;

public void setApp(Main application){
this.application = application;
}


@Override
public void initialize(URL location, ResourceBundle resources) {
btntext.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
System.out.println(loginusr.getText());
System.out.println(loginpwd.getText());
application.Userlogin();
}
});
}

错误发生在:

application.Userlogin();

提前非常感谢

最佳答案

一旦加载 FXML,就会调用 initialize() 方法。看看here

您的initialize()setApp(Main application)之前被调用。此时,application对象尚未初始化,为null!

这意味着 initialize() 方法在

被调用
MainViewController profile = (MainViewController) replaceSceneContent("MainView.fxml");

而当您使用

时,在 initialize() 内部使用的 application 对象会在此行之后实例化
profile.setApp(this);

因此,当您在 initalize() 内尝试代码 application.Userlogin(); 时,在执行时,application 为 null !

关于java - 尝试替换场景内容时 JavaFx 中的指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22807887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com