java - JavaFX 节点未初始化
问题描述
我试图在我的应用程序中更改场景,并且其中一个节点需要在加载场景后直接更新,但问题是节点尚未初始化,所以我总是得到 NPE。在调用该 ndoe 的方法之前,如何强制初始化节点或等到所有节点都已初始化
我从来没有成功尝试调用节点,但是如果我在事件中调用节点(例如按下按钮),它似乎确实有效。
package za.holmes.PAT;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
public class EventHandler implements Initializable {
@FXML
private AnchorPane changePane;
@FXML
private TextField IDField;
@FXML
private PasswordField passField;
@FXML
private Label errorField;
@FXML
private Label nameText;
private User currentUser;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
}
// @FXML
// private void initialize() {
// }
@FXML
private void start(ActionEvent event) {
((Button) event.getSource()).setDisable(true);;
System.out.println("Program started");
try {
System.out.println("Connecting to database");
Class.forName("za.holmes.PAT.DataHandler");
} catch (Exception e) {
e.printStackTrace();
}
updateScreen("Login.fxml");
}
private void updateScreen(String fileName) {
try {
FXMLLoader loader = new FXMLLoader();
AnchorPane pane = (AnchorPane)loader.load(Oldage.class.getResourceAsStream("/scenes/" + fileName));
changePane.getChildren().setAll(pane);
} catch (Exception e) {
e.printStackTrace();
}
}
//Init complete
@FXML
private void login(ActionEvent event) {
String userIDText = "", passText = "";
int user = 0;
try {
errorField.setVisible(false);
userIDText = IDField.getText();
passText = passField.getText();
// This is a call to another method that gets the type of user
// attempting to log in(it will be 1)
user = DataHandler.checkUser(userIDText, passText);
switch (user) {
case 0:
errorField.setVisible(true);
break;
case 1:
updateScreen("Old.fxml");
currentUser = DataHandler.getInfoElder(userIDText);
nameText.setText("Hello");
break;
case 2:
break;
case 3:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
解决方案
是的,只是不要使用单个控制器。使用多个控制器,而不是通过改变元素的可见性来改变屏幕,而不是让每个“场景”都是一个全新的 FXML 文件
推荐阅读
- c# - 如何在运行时将方法名称传递给 Blazor 中 DynamicComponent 生成的组件
- python - 如何避免输出重复数据python selenium
- html - 背景图像不想在css中加载
- makefile - (Makefile) 同一行上的多个字符串替换
- javascript - Next JS 除了放入公共文件夹之外,如何动态导入图片?
- android - 如何在片段中启用硬件加速?
- javascript - 如何在我的网站之外获取引荐来源路径名
- css - 为桌面访问者隐藏 wordpess 上的 mailchimp 弹出窗口
- swiftui - 在推送视图中修改列表绑定属性时弹出 SwiftUI 导航
- javascript - 反应原生过滤器数组不适用于字符串