向JavaFX按钮添加事件处理程序

2025/04/21

1. 简介

1.1 概述

在这个简短的教程中,我们将介绍JavaFX Button组件并了解如何处理用户交互

1.2 JavaFX API

在Java 8、9和10中,无需进行其他设置即可开始使用JavaFX库。从JDK 11开始,该项目将从JDK中移除,并且应将以下依赖添加到pom.xml中:

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>${javafx.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>${javafx-maven-plugin.version}</version>
            <configuration>
                <mainClass>Main</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

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="cn.tuyucheng.taketoday.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类,它负责连接UI元素和应用程序逻辑,我们将在initialize方法中设置按钮的标签:

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. 点击事件

让我们从处理简单的点击事件开始,并向initialize方法添加事件处理程序:

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

当我们点击按钮时,会出现一条新的日志消息:

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

因为事件处理程序接口只有一个方法,所以我们可以将其视为一个函数接口,并用单个Lambda表达式替换这些行,以使我们的代码更易于阅读

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按钮添加事件处理程序并根据事件类型执行不同的操作。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章