Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

События и обработчики

Когда пользователь нажимает кнопку, щёлкает мышью или жмёт клавишу, JavaFX создаёт объект события (event) и передаёт его обработчику — коду, который вы заранее привязали к элементу. Обработчик выполняется в потоке JavaFX. В этом уроке кнопка «Добавить» начнёт по-настоящему работать: проверять заголовок, показывать сообщение и очищать форму.

Поля класса вместо локальных переменных

Обработчики удобно выносить в отдельные методы. Чтобы методы видели элементы формы, элементы становятся полями класса:

// src/main/java/com/example/notes/App.java — поля класса
private final TextField titleField = new TextField();
private final TextArea textArea = new TextArea();
private final ComboBox<String> categoryBox = new ComboBox<>();
private final CheckBox importantBox = new CheckBox("Важная");
private final Label statusLabel = new Label();

statusLabel — строка состояния: она встанет в нижний ряд рядом с кнопками.

Обработчик в отдельном методе

Метод-обработчик принимает объект события ActionEvent. К кнопке его привязывают ссылкой на метод this::addNote:

// src/main/java/com/example/notes/App.java — фрагмент
addButton.setOnAction(this::addNote);
titleField.setOnAction(this::addNote);
 
// ...
 
private void addNote(ActionEvent event) {
    String title = titleField.getText().strip();
    if (title.isEmpty()) {
        statusLabel.setText("Введите заголовок");
        return;
    }
    statusLabel.setText("Добавлена заметка: " + title);
    clearForm();
}
 
private void clearForm() {
    titleField.clear();
    textArea.clear();
    importantBox.setSelected(false);
    titleField.requestFocus();
}

У TextField тоже есть событие onAction — оно срабатывает по клавише Enter. Поэтому заметку можно добавить, не отрывая рук от клавиатуры. requestFocus() возвращает курсор в поле заголовка.

Мышь

Кроме onAction у каждого узла есть события мыши и клавиатуры. Двойной щелчок по строке состояния очистит её:

// src/main/java/com/example/notes/App.java — фрагмент start()
statusLabel.setOnMouseClicked(event -> {
    if (event.getClickCount() == 2) {
        statusLabel.setText("");
    }
});
МетодКогда срабатывает
setOnActionНажатие кнопки, Enter в поле, выбор в ComboBox
setOnMouseClickedЩелчок мышью; getClickCount() — число щелчков
setOnKeyPressedНажатие клавиши, пока узел в фокусе
setOnMouseEnteredКурсор зашёл на узел

Сочетание клавиш

Сочетание, которое работает во всём окне, добавляют сцене. SHORTCUT_DOWN означает Ctrl в Windows и Linux и Cmd в macOS:

// src/main/java/com/example/notes/App.java — фрагмент start()
Scene scene = new Scene(root, 640, 480);
scene.getAccelerators().put(
        new KeyCodeCombination(KeyCode.N, KeyCombination.SHORTCUT_DOWN),
        this::clearForm);

Теперь Ctrl+N очищает форму, где бы ни был курсор.

Проверка

В нижний ряд добавьте строку состояния: new HBox(8, addButton, new Button("Удалить"), statusLabel). Запустите приложение, введите «Купить молоко» и нажмите Enter. Справа от кнопок появится «Добавлена заметка: Купить молоко», поля очистятся, флажок снимется. Нажмите «Добавить» с пустым полем — строка сменится на «Введите заголовок».

Частая ошибка

Вместо ссылки на метод пишут вызов: addButton.setOnAction(addNote());. Скобки вызывают метод сразу, а не передают его кнопке, поэтому компилятор отвечает method addNote in class com.example.notes.App cannot be applied to given types; required: javafx.event.ActionEvent; found: no arguments. Передавайте сам метод: this::addNote или лямбду event -> addNote(event).

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.