我从一个控制器访问对象时遇到问题。 我有三个控制器和三个窗口。这三个窗口都有效。
我想在第三个控制器中访问来自第二个控制器的对象用户用户。这个对象在Second controller
中成功启动,但是当我尝试在第三个控制器中访问它时,我得到空指针。
Main:
public class Main extends Application {
private Stage primaryStage;
@Override
public void start(Stage primaryStage) {
this.primaryStage=primaryStage;
mainWindow();
}
public void mainWindow() {
try {
FXMLLoader loader=
new FXMLLoader(
Main.class.getResource("/application/User.fxml"));
AnchorPane pane=loader.load();
Scene scene=new Scene(pane);
ControllerUser controllerUser=
loader.getController();
controllerUser.setMain(this,primaryStage);
primaryStage.setScene(scene);
primaryStage.show();
scene.getStylesheets().add
(Main.class.getResource("application.css").toExternalForm());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
First Controller
public class ControllerUser {
private Main main;
private Stage primaryStage;
public String localuser;
public void setMain(Main main, Stage primaryStage) {
this.main = main;
this.primaryStage = primaryStage;
}
@FXML
public void closeMainWindow() {
primaryStage.close();
}
@FXML
TextField textFieldNick;
@FXML
Button buttonGraj;
@FXML
void graj() {
localuser = textFieldNick.getText();
// System.out.println(localuser);
try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/application/fxml.fxml"));
AnchorPane pane = loader.load();
Stage testStage = new Stage();
testStage.initOwner(primaryStage);
Scene scene = new Scene(pane);
testStage.setScene(scene);
Kontroller kontrollerTest = loader.getController();
kontrollerTest.setStage(this, testStage);
primaryStage.close();
testStage.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
}
public String getLocaluser() {
return localuser;
}
public void setLocaluser(String localuser) {
this.localuser = localuser;
}
}
Second Controller:
public class Kontroller {
// Aby okno sie otowryzlo
private Stage primaryStage;
ControllerUser controllerUser;
public void setStage(ControllerUser controllerUser, Stage primaryStage) {
this.controllerUser = controllerUser;
this.primaryStage = primaryStage;
};
// ...
private User user;
// ...
public double wynikKoncowy(ArrayList<Gra> g) {
// ...
user = new User(controllerUser.getLocaluser(), wynikkoncowy /*...*/)
// ...
};
// ...
public void otworzKolejneOkno() {
try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/application/Thankyou.fxml"));
AnchorPane pane = loader.load();
Stage testStage2 = new Stage();
Scene scene = new Scene(pane);
testStage2.setScene(scene);
KontrollerThxpage kontrollerThx = loader.getController();
kontrollerThx.setStage(this, testStage2);
primaryStage.close();
testStage2.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
第三控制器:
public class KontrollerThxpage {
private Stage primaryStage;
Kontroller kontrollerTest;
public void setStage(Kontroller kontrollerTest, Stage primaryStage) {
this.kontrollerTest = kontrollerTest;
this.primaryStage = primaryStage;
};
@FXML
TextField wynik;
@FXML
public void initialize() {
kontrollerTest.getUser();
}
}
答案 0 :(得分:0)
在执行initialize()
中的load()
方法期间,将调用控制器中的FXMLLoader
方法。
所以当你这样做时
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/application/Thankyou.fxml"));
AnchorPane pane = loader.load();
// ...
KontrollerThxpage kontrollerThx = loader.getController();
kontrollerThx.setStage(this, testStage2);
您在initialize()
之前有效地致电KontrollerThxpage
,然后再致电kontrollerThx.setStage(...)
。所以当时kontrollerTest
仍为空。
最简单的解决方法是将依赖kontrollerTest
的代码移至setStage(...)
方法:
public class KontrollerThxpage {
private Stage primaryStage;
Kontroller kontrollerTest;
public void setStage(Kontroller kontrollerTest, Stage primaryStage) {
this.kontrollerTest = kontrollerTest;
this.primaryStage = primaryStage;
kontrollerTest.getUser();
};
@FXML
TextField wynik;
@FXML
public void initialize() {
}
}