- Зберігання даних в XML
- Використання компонента JavaFX FileChooser
- Використання компонента JavaFX Menu
- Збереження шляху до останнього відкритого файлу в призначених для користувача настройках
Збереження налаштувань
Завдяки класу Preferences. Java дозволяє зберігати деяку інформацію про стан програми. Залежно від операційної системи, Preferences зберігаються в різних місцях (наприклад, в файлі реєстру Windows).
Наступні два методи забезпечують збереження і відновлення налаштувань нашого застосування. Додайте їх в кінець класу MainApp:
MainApp.java
Зберігання даних в XML
Чому саме XML?
Один з найбільш поширених способів зберігання даних, це використання баз даних. У той час, як дані, які ми повинні зберігати, є об'єктами, бази даних містять їх у вигляді реляційних даних (наприклад, таблиць). Це називається об'єктно-реляційне неузгодженість імпенданс. Для того, щоб привести наші об'єктні дані у відповідність з реляційними таблицями, потрібно виконати додаткову роботу. Існують фреймворки, які допомагають наводити об'єктні дані у відповідність з реляційною базою даних (Hibernate - один з найбільш популярних), але щоб почати їх використовувати, також необхідно виконати додаткову роботу і настройку.
Для нашої простої моделі даних набагато легше зберігати дані у вигляді XML. Для цього ми будемо використовувати бібліотеку JAXB (J ava A rchitechture for X ML B inding). Написавши всього кілька рядків коду, JAXB дозволить нам згенерувати приблизно такий XML-файл:
Приклад згенерованого XML-файла
Використання JAXB
Бібліотека JAXB вже включена в JDK. Це означає, що ніяких додаткових бібліотек підключати не доведеться.
JAXB надає дві основні функції: здатність до маршаллірованію об'єктів Java в XML і зворотний демаршалізацію з xml-файлу в об'єкти Java.
Для того, щоб за допомогою JAXB можна було виконувати подібні перетворення, нам необхідно підготувати нашу модель.
Підготовка класу-моделі для JAXB
Створіть в пакеті ch.makery.address.model новий клас PersonListWrapper.
PersonListWrapper.java
Зверніть увагу на дві анотації:
- @XmlRootElement визначає ім'я кореневого елемента.
- @XmlElement це необов'язкове ім'я, яке ми можемо поставити для елемента.
Читання і запис даних за допомогою JAXB
Зробимо наш клас MainApp відповідальним за читання і запис даних нашого застосування. Для цього додайте в кінець класу MainApp.java два методи:
Маршаллінг і демаршалізація готові. Тепер для того, щоб використовувати новий функціонал, давайте створимо пункти меню для збереження і завантаження.
Обробка дій меню
Ми вже створювали меню в файлі RootLayout.fxml. але поки не використовували його. Перед тим, як ми додамо в наше меню поведінку, давайте створимо в ньому всі необхідні пункти.
У додатку Scene Builder відкрийте файл RootLayout.fxml і перенесіть необхідну кількість пунктів меню (MenuItem) з вкладки Library на вкладку Hierarchy. Створіть наступні пункти меню: New. Open. . Save. Save as. і Exit.
Підказка: для установки на пункти меню гарячих клавіш Використовуйте властивість Accelerator у вкладці Properties.
клас RootLayoutController
Для обробки поведінки меню нам необхідний ще один клас-контролер. У пакеті ch.makery.address.view створіть клас RootLayoutController.
RootLayoutController.java
компонент FileChooser
Зверніть увагу на методи в класі RootLayoutController. які використовують компонент FileChooser. Спершу ми створюємо новий екземпляр класу FileChooser. Потім застосовуємо фільтр розширення - при виборі файлів будуть показуватися тільки ті, які мають розширення .xml. Ну і нарешті, ми відображаємо даний компонент вище PrimaryStage.
Якщо користувач закриває діалогове вікно вибору файлів нічого не вибравши, то повертається null. В іншому випадку ми беремо обраний файл і передаємо його в методи loadPersonDataFromFile (.) Або savePersonDataToFile (.). які знаходяться в класі MainApp.
Зв'язування fxml-вистави з класом-контролером
У додатку Scene Builder відкрийте файл RootLayout.fxml. У вкладці Controller як класу-контролера виберіть значення RootLayoutController.
Перейдіть на вкладку Hierarchy і виберіть пункт меню. У вкладці Code як значення властивості On Action ви можете побачити всі доступні методи обраного класу-контролера. Виберіть метод, який відповідає цьому пункту меню.
Повторіть попередній крок для кожного пункту меню.
Закрийте програму Scene Builder і обновіть проект (натисніть Refresh (F5) на кореневій папці вашого проекту). Це дозволить середовищі розробки Eclipse "побачити" зміни, зроблені в додатку Scene Builder.
Зв'язування головного класу з класом RootLayoutController
Відкрийте клас MainApp і замініть метод initRootLayout () наступним кодом:
Зверніть увагу на два зміни: на рядки, що дають доступ контролера до головного класу програми та на три останні рядки для завантаження останнього відкритого файлу із записами.
тестування
Усередині пакета ch.makery.address.util створіть новий клас LocalDateAdapter і скопіюйте туди наступний код:
LocalDateAdapter.java
Потім відкрийте клас Person.java і анотує метод getBirthday ():
Тепер запустіть додаток ще раз. Спробуйте зберегти і завантажити xml-файл з даними. Додаток має автоматично завантажувати останній відкритий файл після перезапуску.
Як це працює
Давайте подивимося як це все працює разом:
Що далі?
У 6-ї частини підручника ми додамо статистичний графік днів народжень.