我正在尝试编写一个简单的登录屏幕,该屏幕将导致另一个程序。
用户可以1)登录或2)注册-两个不同的场景。
用户注册后,用户名/加密密码将保存在数据库中。
用户登录时,可以选择将程序暂时保存在计算机上的XML文件中,以使程序下次记住其登录详细信息。
我的想法是,让程序检查场景加载时是否存在XML文件,如果存在,则用XML文件中的数据预填充字段。
我已经使XML阅读器工作了(只是在这种情况下不是),并且我收集到做到这一点的最佳方法是通过initialize选项运行它,因为我知道这是在任何情况下完成的。动作被触发了吗?
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
File file = new File("C:\\Users\\konta\\IdeaProjects\\project\\files\\rememberme.xml");
boolean exists = file.exists();
if (exists) {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(file);
document.getDocumentElement().normalize();
savedUsername = document.getElementsByTagName("Username").item(0).getTextContent();
savedPassword = document.getElementsByTagName("Password").item(0).getTextContent();
if (savedUsername.length() >= 1 && savedPassword.length() == 44) {
usernameInput.setText(username);
passwordInput.setText(password);
}
}
}
此代码需要引发三个异常,这些异常在初始化中是不允许的。
是否有其他方法可以读取XML输入并以initialize方法运行它呢?
谢谢 -Kim Andre Langholz
答案 0 :(得分:2)
与Haroldo_OK's answer says一样,一种方法是将代码括在try / catch块中。但是还有另一种方式。您无需实现javafx.fxml.Initializable
接口即可利用其功能。从文档中:
注意该接口已通过自动将
location
和resources
属性注入到控制器中而被取代。 FXMLLoader现在将自动调用控制器定义的任何带有适当注释的无参数initialize()
方法。建议尽可能使用注射方法。
以此,您可以将代码更改为以下内容:
public class Controller {
// If you still need access to the URL or ResourceBundle
@FXML private URL location;
@FXML private ResourceBundle resources;
@FXML
private void initialize() throws Exception { // can now add throws clause
File file = new File("C:\\Users\\konta\\IdeaProjects\\project\\files\\rememberme.xml");
boolean exists = file.exists();
if (exists) {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(file);
document.getDocumentElement().normalize();
savedUsername = document.getElementsByTagName("Username").item(0).getTextContent();
savedPassword = document.getElementsByTagName("Password").item(0).getTextContent();
if (savedUsername.length() >= 1 && savedPassword.length() == 44) {
usernameInput.setText(username);
passwordInput.setText(password);
}
}
}
}
请注意,此设置会将所有抛出的异常传播到FXMLLoader.load
的调用方;它将被包装在InvocationTargetException
中。如果您可以从initilaize
方法内的错误中恢复过来,则应使用Haroldo_OK建议的try / catch块。
答案 1 :(得分:1)
您将必须用try/catch block
括住您的代码