我是JavaFX的新手,在做我的项目时,我正在尝试切换屏幕 . 我正在考虑将相应的AnchorPane可见性设置为true或false,并且从另一个Controller访问AnchorPane时遇到问题 . 我试图使AnchorPane静态,但它给出了NullPointerException .
这是我的代码 .
Controller class
public class Controller {
@FXML
AnchorPane signInPane;
@FXML
private TextField usernameForSignIn;
@FXML
private PasswordField password;
@FXML
private Button signIn;
@FXML
private Button registration;
@FXML
void initialize() {
registration.setOnAction(event -> {
signInPane.setVisible(false);
SignUpController.registerPane.setVisible(true);
});
signIn.setOnAction(event -> {
String usernameText = usernameForSignIn.getText().trim();
String passwordText = password.getText().trim();
if(!usernameText.equals("") && !passwordText.equals("")) {
loginUser(usernameText, passwordText);
} else {
System.out.println("Empty login and/or password");
}
});
}
private void loginUser(String usernameText, String passwordText) {
}
}
SignUpController Class
public class SignUpController {
@FXML
static AnchorPane registerPane;
@FXML
private TextField email;
@FXML
private PasswordField pass;
@FXML
private Button signUp;
@FXML
private TextField fname;
@FXML
private TextField lname;
@FXML
private TextField username;
@FXML
private RadioButton radioMale;
@FXML
void initialize() {
signUp.setOnAction(event -> {
signUpNewUser();
});
}
private void signUpNewUser() {
DatabaseHandler databaseHandler = new DatabaseHandler();
String firstName = fname.getText();
String lastName = lname.getText();
String usname = username.getText();
String password = pass.getText();
String e_mail = email.getText();
String gender = "";
if(radioMale.isSelected()) {
gender = "Male";
} else {
gender = "Female";
}
User user = new User(firstName,lastName,usname,password,e_mail,gender);
databaseHandler.signUpUser(user);
}
}
我需要从这个屏幕出发
没有关闭窗口
我试图像这样解决问题,但它会关闭窗口并打开一个新窗口 .
registration.setOnAction(event -> {
registration.getScene().getWindow().hide();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample/view/signUp.fxml"));
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
Parent root = loader.getRoot();
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.showAndWait();
// signInPane.setVisible(false);
});
2 回答
创建一个窗口并重复使用它,而不是每次都创建一个新窗口 . 然后你可以检查它是否正在显示,或者你可以禁用它显示时显示的任何控件 .
这样的事情将确保你的FXML在initalize()之前加载 . 您不必隐藏您的AnchorPane,因为实例已经加载 . 隐藏从FXML创建的项目通常会导致错误 .