0

0

Vaadin:跨多个组件监听事件

DDD

DDD

发布时间:2025-10-21 09:32:32

|

215人浏览过

|

来源于php中文网

原创

vaadin:跨多个组件监听事件

本文介绍了如何在 Vaadin 应用中跨多个组件监听事件。通过利用 UI 事件总线,可以在不同的组件之间传递和处理事件,实现组件间的解耦和灵活交互。文章将提供示例代码,演示如何在主视图中监听来自对话框组件的关闭事件,并根据事件触发相应的操作。

在 Vaadin 应用开发中,经常需要在不同的组件之间传递和处理事件。例如,一个对话框组件关闭后,需要在主视图中执行一些操作。一种常见的解决方案是使用 UI 事件总线,允许组件发布事件,其他组件可以监听这些事件并做出相应的响应。

利用 UI 事件总线

Vaadin 提供了 UI 类的事件总线,它允许应用程序中的任何组件发布和订阅事件。这种机制特别适合在组件之间传递信息,而无需直接依赖或了解彼此的内部实现。

示例:监听对话框关闭事件

假设我们有一个 MainView (主视图) 和一个 CustomDialog (自定义对话框) 组件。当 CustomDialog 关闭时,我们希望 MainView 能够接收到这个事件并执行一些操作,例如显示一个按钮来重新打开对话框。

首先,我们需要定义一个自定义事件 ComponentCloseEvent:

Onu
Onu

将脚本转换为内部工具,不需要前端代码。

下载
import com.vaadin.flow.component.ComponentEvent;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.DomEvent;

public class ComponentCloseEvent extends ComponentEvent {

    public ComponentCloseEvent(Component source, boolean fromClient) {
        super(source, fromClient);
    }
}

接下来,在 CustomDialog 组件中,当对话框关闭时,触发这个事件:

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.ComponentUtil;

public class CustomDialog extends Dialog {

    public CustomDialog() {
        Button closeButton = new Button("Close", e -> {
            ComponentUtil.fireEvent(this, new ComponentCloseEvent(this, true));
            close();
        });
        add(closeButton);
    }
}

在 MainView 组件中,我们需要在组件附加到 UI 时注册一个监听器,监听 ComponentCloseEvent 事件。这可以在 onAttach() 方法中完成:

import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.AttachEvent;
import com.vaadin.flow.component.ComponentEventListener;

@Route("")
public class MainView extends VerticalLayout {

    @Override
    protected void onAttach(AttachEvent attachEvent) {
        UI ui = attachEvent.getUI();

        ComponentEventListener listener = e -> {
            System.out.println("Dialog closed!");
            // 在这里执行你想要的操作,例如显示一个按钮
        };

        ui.addDetachListener(detachEvent -> {
            // 移除监听器,避免内存泄漏
            ui.removeComponentAttachListener(null); //这里listener需要被移除,不然会报内存泄漏
        });

        ui.addComponentAttachListener(componentAttachEvent -> {
            if(componentAttachEvent.isInitialAttach(attachEvent.getUI())){
                ui.addDetachListener(detachEvent -> ui.removeComponentAttachListener(componentAttachEvent));
                ui.addDetachListener(detachEvent -> ui.removeComponentEventListener(ComponentCloseEvent.class, listener));
                ui.addComponentEventListener(ComponentCloseEvent.class, listener);
            }
        });
        add(new CustomDialog());
    }
}

代码解释:

  • ComponentUtil.fireEvent(this, new ComponentCloseEvent(this, true)): 这行代码在 CustomDialog 关闭时触发 ComponentCloseEvent 事件。
  • UI.getCurrent().addDetachListener(...): 确保在 MainView 从 UI 中移除时,移除事件监听器,避免内存泄漏。
  • UI.getCurrent().addComponentEventListener(ComponentCloseEvent.class, e -> { ... }): 这行代码注册一个监听器,监听 ComponentCloseEvent 事件。当事件发生时,监听器中的代码将被执行。

注意事项:

  • 为了避免内存泄漏,请务必在组件从 UI 中移除时,移除事件监听器。
  • UI 事件总线是全局的,因此请确保事件名称具有唯一性,以避免与其他组件的事件冲突。
  • 使用 ComponentUtil.fireEvent() 触发事件,确保事件能够正确地传播到监听器。

总结

通过利用 Vaadin 的 UI 事件总线,我们可以轻松地实现跨多个组件的事件监听。这种机制能够提高代码的可维护性和可扩展性,使我们能够构建更加灵活和强大的 Vaadin 应用程序。记住要适当地添加和移除监听器,以避免内存泄漏。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

454

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

6

2025.12.06

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2025.12.24

拼豆图纸在线生成器
拼豆图纸在线生成器

拼豆图纸生成器有PixelBeads在线版、BeadGen和“豆图快转”;推荐通过pixelbeads.online或搜索“beadgen free online”直达官网,避开需注册的诱导页面。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

84

2025.12.24

俄罗斯搜索引擎yandex官方入口地址(最新版)
俄罗斯搜索引擎yandex官方入口地址(最新版)

Yandex官方入口网址是https://yandex.com。用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

553

2025.12.24

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

155

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

20

2025.12.24

Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

47

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

7

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.8万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号