JavaFX-需要通过初始化预填充字段,但不允许例外。有什么办法解决吗?

时间:2018-12-27 17:15:12

标签: java javafx

我正在尝试编写一个简单的登录屏幕,该屏幕将导致另一个程序。

用户可以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

2 个答案:

答案 0 :(得分:2)

Haroldo_OK's answer says一样,一种方法是将代码括在try / catch块中。但是还有另一种方式。您无需实现javafx.fxml.Initializable接口即可利用其功能。从文档中:

  

注意该接口已通过自动将locationresources属性注入到控制器中而被取代。 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

括住您的代码