JavaFX - необходимо предварительно заполнить поле с помощью инициализации, но оно не допустит исключений.Есть ли способ обойти это? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь кодировать простой экран входа в систему, который приведет к другой программе.

Пользователь может 1) Войти или 2) Зарегистрироваться - две разные сцены.

Когда пользователь регистрируется, имя пользователя / зашифрованный пароль сохраняется в базе данных.

Когда пользователь входит в систему, у него есть возможность, чтобы программа запомнила его данные для входа в систему в следующий раз, временно сохранив их на своем компьютере в файле XML.

Моя идея состояла в том, чтобы программа проверила, существует ли файл XML при загрузке сцены, и если он существует, то предварительно заполните поля данными из файла XML.

Я заставил работать XML-ридер (только не в этом конкретном случае) и понял, что лучший способ сделать это - запустить его через опцию инициализации, как я понимаю, этозавершено до того, как какое-либо действие инициировано?

Вот мой код:

@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 и запуска его в методе инициализации, к которому вы могли бы привести меня?

Спасибо - Ким Андре Лангхольц

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Как ответ Haroldo_OK: , один из способов - заключить код в блок try / catch.Но есть и другой способ.Вам не нужно реализовывать интерфейс javafx.fxml.Initializable, чтобы воспользоваться его функциональностью.Из документации:

ПРИМЕЧАНИЕ Этот интерфейс был заменен автоматическим введением свойств location и resources в контроллер. FXMLLoader теперь будет автоматически вызывать любой соответствующим образом аннотированный метод no-arg 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, то вам следует использовать блок try / catch, как рекомендует Haroldo_OK.

0 голосов
/ 27 декабря 2018

Вы должны будете окружить свой код блоком try / catch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...