java - 切换到不同的屏幕 JavaFX 和 FXML
问题描述
我是 JavaFX 的新手,在做我的项目时,我正在尝试切换屏幕。我正在考虑将相应的 AnchorPane 可见性设置为真或假,并且在从另一个控制器访问 AnchorPane 时遇到问题。我试图使 AnchorPane 静态,但它给出了 NullPointerException。
这是我的代码。
控制器类
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) {
}
}
注册控制器类
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);
});
解决方案
这样的事情将确保您的 FXML 在 initalize() 之前加载。您不必隐藏 AnchorPane,因为实例已经加载。隐藏从 FXML 创建的项目通常会导致错误。
public class Controller {
@FXML
Button button_CustomerInfo;
@FXML
Button button_A1Child;
@FXML
BorderPane bPane;
@FXML
ToggleGroup tog;
Parent r1;
Parent r2;
// CREATE SOMETHING LIKE THIS
// THIS SAMPLE CODE USES THE SAME BORDERPANE
// AND THE CENTER OF THE BORDERPANE
// IS CHANGED WHEN A BUTTON IS PRESSED
{
try {
r1 = FXMLLoader.load(getClass().getResource("SecondSreen.fxml"));
r2 = FXMLLoader.load(getClass().getResource("FirstScreen.fxml"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void initialize() {
button_CustomerInfo.setOnAction(e-> {
bPane.setCenter(r2);
});
button_A1Child.setOnAction(e-> {
bPane.setCenter(r1);
});
}
}
推荐阅读
- nested - Entity Framework Core Explicit Loading 如何忽略更深的嵌套实体
- c# - 循环遍历集合时如何选择随机记录?
- c# - 如何从 .NET Core Rest API 发出一个流以在 Angular 中作为 observable 使用?
- python - 在使用 5 折交叉验证时,在高度不平衡的数据中混淆 F1 分数和 AUC 分数
- kubernetes - K8 DNS 无法解析
- python - python矩阵的组合
- c# - 如何通过单击按钮更改另一个对象的动画?
- linux - AWS EC2 的 SCAP 合规性检查器错误
- regex - 用正则表达式 Erlang/Pearl 替换或忽略多个子字符串
- sql - 更改 SQL Server Express 默认 R 库路径