Элементы управления
Элементы управления (controls) — это узлы, с которыми работает пользователь: поля ввода, флажки, списки выбора, кнопки. Все они лежат в пакете javafx.scene.control. У каждого есть метод, который возвращает текущее значение, — его и читают, когда пользователь нажимает кнопку.
Основные элементы
| Класс | Что это | Как прочитать значение |
|---|---|---|
Label | Надпись | getText() |
TextField | Однострочное поле | getText() |
TextArea | Многострочное поле | getText() |
CheckBox | Флажок | isSelected() |
ComboBox | Выпадающий список | getValue() |
Button | Кнопка | — |
Поля ввода
// src/main/java/com/example/notes/App.java — фрагмент start()
TextField titleField = new TextField();
titleField.setPromptText("Например, Купить молоко");
TextArea textArea = new TextArea();
textArea.setPrefRowCount(5);
textArea.setWrapText(true);setPromptText — серая подсказка в пустом поле. setPrefRowCount(5) делает многострочное поле высотой в пять строк, а setWrapText(true) переносит длинные строки вместо горизонтальной прокрутки.
Выпадающий список и флажок
// src/main/java/com/example/notes/App.java — фрагмент start()
ComboBox<String> categoryBox = new ComboBox<>();
categoryBox.getItems().addAll("Работа", "Дом", "Идеи");
categoryBox.setValue("Идеи");
CheckBox importantBox = new CheckBox("Важная");ComboBox — обобщённый класс: в угловых скобках указывают тип вариантов. getItems() возвращает список вариантов, setValue выбирает начальный. Флажок создаётся с подписью и по умолчанию снят.
Кнопка
Кнопке передают действие — лямбду, которая выполнится при нажатии. Здесь она просто печатает значения формы:
// src/main/java/com/example/notes/App.java — фрагмент start()
Button addButton = new Button("Добавить");
addButton.setOnAction(event -> {
System.out.println("Заголовок: " + titleField.getText());
System.out.println("Текст: " + textArea.getText());
System.out.println("Категория: " + categoryBox.getValue());
System.out.println("Важная: " + importantBox.isSelected());
});Подробно о событиях — в следующем уроке.
Форма целиком
Поставим элементы в сетку из прошлого урока. BorderPane здесь создан конструктором с пятью областями в порядке: центр, верх, право, низ, лево.
// src/main/java/com/example/notes/App.java — фрагмент start()
GridPane form = new GridPane();
form.setHgap(8);
form.setVgap(8);
form.setPadding(new Insets(0, 0, 0, 16));
form.add(new Label("Заголовок:"), 0, 0);
form.add(titleField, 1, 0);
form.add(new Label("Текст:"), 0, 1);
form.add(textArea, 1, 1);
form.add(new Label("Категория:"), 0, 2);
form.add(categoryBox, 1, 2);
form.add(importantBox, 1, 3);
// ...правила колонок, listPane и buttons — как в прошлом уроке
Label header = new Label("Мои заметки");
BorderPane root = new BorderPane(form, header, null, buttons, listPane);Флажок стоит в колонке 1, под полями, — подпись слева ему не нужна. Строка с кнопками теперь создаётся как new HBox(8, addButton, new Button("Удалить")), чтобы в ней была кнопка с действием.
Проверка
Запустите приложение, введите «Купить молоко», в текст — «2 литра, обезжиренное», выберите категорию «Дом», отметьте «Важная» и нажмите «Добавить». В терминале появится:
Заголовок: Купить молоко
Текст: 2 литра, обезжиренное
Категория: Дом
Важная: trueЧастая ошибка
Если не вызвать setValue, у ComboBox нет выбранного значения и getValue() возвращает null. Код вроде categoryBox.getValue().length() падает с java.lang.NullPointerException: Cannot invoke "String.length()" because the return value of "javafx.scene.control.ComboBox.getValue()" is null. Задавайте начальное значение или проверяйте его на null перед использованием.