Javafx
Javafx
Часть 1: Содержание
Знакомство с JavaFX;
Создание и запуск проекта JavaFX;
Использование приложения Scene Builder для проектирования пользовательского
интерфейса;
Простая структуризация приложения с использованием шаблона MVC.
Предварительные требования
Нам нужно указать среде разработки NetBeans (Tools-Options) задать путь к приложению
Scene Builder:
14. Приведите своё окно в соответствие с тем, что показано на рисунке, добавляя
компоненты Label внутрь ячеек компонента GridPane.
Примечание: для того, чтобы добавить новый ряд в компонент GridPane,
выберите существующий номер ряда (он окрасится жёлтым), кликните правой
кнопкой мышки на номере ряда и выберите пункт "Add Row Above" или "Add Row
Below".
15. Внизу добавьте ButtonBar, а в него три кнопки Button. Теперь установите привязки
к границам (правой и нижней), чтобы ButtonBar всегда находилась справа.
Так как панель ButtonBar доступна только с JavaFX 8, и её поддержка в Scene Builder на
данный момент несколько хромает, то имеется альтернативный способ. Добавьте три
компонента Button в правую часть так, как показано на предыдущем рисунке. Выделите их
всех вместе (Shift + клик), кликните по ним правой кнопкой мышки и выберите пункт
Wrap In | HBox. Это действие их сгруппирует. Вы можете задать расстояние (Spacing)
между компонентами во вкладке Layout компонента HBox. Также установите привязки к
границам (правой и нижней).
1. Если всё сделано правильно, то у нас должно получится что-то похожее на рисунок
ниже. Используйте пункт меню Preview, чтобы протестировать созданное окно и
его реакцию на изменение размеров.
Часть 2: Содержание
Создание класса-модели;
Использование класса-модели в коллекции ObservableList;
Отображение данных в компоненте TableView с помощью Контроллеров.
Создание класса-модели
Класс-модель необходим для хранения в нашей будущей адресной книге информации об
адресатах. Добавьте класс Person.java в пакет addressapp. В нём будет несколько
переменных для хранения информации об имени, адресе и дне рождения.
Person.java
package addressapp;
import java.time.LocalDate;
Объяснение
Класс LocalDate, тип которого мы выбрали для нашей переменной birthday, это часть
нового Date and Time API для JDK 8.
Список людей
Основные данные, которыми оперирует наше приложение - это группа экземпляров
класса Person. Давайте создадим в классе FXMLDocumentController.java список
объектов класса Person. Все остальные классы-контроллеры позже получат доступ к
этому центральному списку внутри этого класса.
Список ObservableList
Примечание: При импорте пакетов всегда используйте пакет javafx, а НЕ awt или swing!
FXMLDocumentController.java
package addressapp;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
@FXML
private Label firstNameLabel;
@FXML
private Label lastNameLabel;
@FXML
private Label streetLabel;
@FXML
private Label postalCodeLabel;
@FXML
private Label cityLabel;
@FXML
private Label birthdayLabel;
@FXML
public void initialize() {
// В качестве образца добавляем некоторые данные
personData.add(new Person("Hans", "Muster"));
personData.add(new Person("Ruth", "Mueller"));
personData.add(new Person("Heinz", "Kurz"));
personData.add(new Person("Cornelia", "Meier"));
personData.add(new Person("Werner", "Meyer"));
personData.add(new Person("Lydia", "Kunz"));
personData.add(new Person("Anna", "Best"));
personData.add(new Person("Stefan", "Meier"));
personData.add(new Person("Martin", "Mueller"));
// Инициализация таблицы адресатов с двумя столбцами.
firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));
lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));
// Добавление в таблицу данных из наблюдаемого списка
personTable.setItems(personData);
}
Все поля и методы, к которым fxml-файлу потребуется доступ, должны быть отмечены
аннотацией @FXML. Несмотря на то, что это требование предъявляется только для полей и
методов с модификатором private, лучше оставить их закрытыми и помечать аннотацией,
чем делать публичными!
После загрузки fxml-файла автоматически вызывается метод initialize(). На этот
момент все FXML-поля должны быть инициализированы;
Метод setCellValueFactory(...) определяет, какое поле внутри класса Person будет
использоваться для конкретного столбца в таблице (PropertyValueFactory,).
Класс FXMLDocumentController
Привязка класса-контроллера к fxml-файлу
Данная часть учебника близится к своему завершению, однако мы пропустили одну
маленькую деталь! Мы не сказали файлу FXMLDocument.fxml, какой контроллер он
должен использовать, а так же не указали соответствие между элементами представления
и полями внутри класса-контроллера. Для этого:
Запуск приложения
После запуска приложения мы должны увидеть что-то похожее на то, что изображено на
картинке в начале данной статьи.
Поздравляю!
Примечание: пока ещё при выборе конкретного адресата у нас не обновляются метки.
Взаимодействие с пользователем мы будем программировать в следующей части
учебника.
http://code.makery.ch/library/javafx-8-tutorial/ru/part3/