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» и тестовую метку в нижней части окна:
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 .