Перейти к основному содержимому

Добавление обработчика событий к кнопке JavaFX

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы рассмотрим компонент JavaFX Button и посмотрим, как мы можем обрабатывать взаимодействие с пользователем .

2. Настройка приложения

Во- первых, давайте создадим небольшое приложение, чтобы иметь возможность сосредоточиться на обработчиках событий . Начнем с создания простого макета FXML , содержащего кнопку:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<BorderPane xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
fx:controller="com.foreach.button.eventhandler.ButtonEventHandlerController"
prefHeight="200.0" prefWidth="300.0">
<center>
<Button fx:id="button" HBox.hgrow="ALWAYS"/>
</center>

<bottom>
<Label fx:id="label" text="Test label"/>
</bottom>
</BorderPane>

Давайте создадим класс ButtonEventHandlerController . Это отвечает за соединение элементов пользовательского интерфейса и логики приложения . Мы установим метку кнопки в методе инициализации :

public class ButtonEventHandlerController {

private static final Logger logger = LoggerFactory.getLogger(ButtonEventHandlerController.class);

@FXML
private Button button;

@FXML
private Label label;

@FXML
private void initialize() {
button.setText("Click me");
}
}

Запустим приложение. Мы должны увидеть кнопку в центре под названием «Click me» и тестовую метку в нижней части окна:

./fcd3c306dce2c597053f491fa4e1c74e.png

3. Нажмите Событие

Начнем с обработки простых событий щелчка и добавления обработчика событий в метод инициализации:

button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
logger.info("OnAction {}", event);
}
});

Давайте проверим это сейчас. Когда мы нажимаем на кнопку, появляется новое сообщение журнала:

INFO c.b.b.e.ButtonEventHandlerController - OnAction javafx.event.ActionEvent[source=Button[id=searchButton, styleClass=button]'Click me']

Поскольку интерфейс обработчика событий имеет только один метод, мы можем рассматривать его как функциональный интерфейс и заменить эти строки одним лямбда-выражением, чтобы наш код было легче читать :

searchButton.setOnAction(event -> logger.info("OnAction {}", event));

Попробуем добавить еще один обработчик события клика. Мы можем просто скопировать эту строку и изменить сообщение журнала, чтобы увидеть разницу при тестировании приложения:

button.setOnAction(event -> logger.info("OnAction {}", event));
button.setOnAction(event -> logger.info("OnAction2 {}", event));

Теперь, когда мы нажимаем на кнопку, мы видим только сообщение «OnAction 2». Это происходит потому, что второй вызов метода setOnAction заменил первый обработчик события вторым.

4. Различные события

Мы можем обрабатывать и другие типы событий, такие как нажатие/отпускание мыши, перетаскивание и события клавиатуры.

Давайте добавим эффект наведения для нашей кнопки. Мы будем отображать тень, когда курсор начинает наводиться на кнопку, и убирать эффект, когда курсор покидает ее:

Effect shadow = new DropShadow();
searchButton.setOnMouseEntered(e -> searchButton.setEffect(shadow));
searchButton.setOnMouseExited(e -> searchButton.setEffect(null));

5. Повторное использование обработчиков событий

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

EventHandler<MouseEvent> rightClickHandler = event -> {
if (MouseButton.SECONDARY.equals(event.getButton())) {
button.setFont(new Font(button.getFont().getSize() + 1));
}
};

Однако у него нет функциональности, потому что мы не связали его ни с какими событиями. Давайте используем этот обработчик событий для события нажатия кнопки и метки мыши:

button.setOnMousePressed(rightClickHandler);
label.setOnMousePressed(rightClickHandler);

Теперь, когда мы тестируем приложение и нажимаем вторичной кнопкой мыши на метку или кнопку, мы видим, что размер шрифта увеличивается.

6. Заключение

Мы научились добавлять обработчики событий к кнопкам JavaFX и выполнять различные действия в зависимости от типа события.

Как всегда, реализация кода доступна на GitHub .