使用 Vaadin UI 事件总线在多个组件间监听事件

使用 vaadin ui 事件总线在多个组件间监听事件

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

在 Vaadin 应用开发中,组件间的通信是一个常见的需求。当需要在不同的组件之间传递事件并执行相应的操作时,可以使用 Vaadin 提供的 UI 事件总线。UI 事件总线允许组件发布事件,而其他组件可以监听这些事件并做出响应,从而实现组件间的解耦和灵活通信。

使用 UI 事件总线

要使用 UI 事件总线,需要在主视图中监听事件,并在需要触发事件的组件中使用 ComponentUtil.fireEvent() 方法。

示例代码

以下示例演示了如何在 MainView 中监听来自 CustomDialog 组件的 ComponentCloseEvent 事件。

首先,定义 ComponentCloseEvent 事件:

Midjourney Midjourney

当前最火的AI绘图生成工具,可以根据文本提示生成华丽的视觉图片。

Midjourney 454 查看详情 Midjourney

import com.vaadin.flow.component.ComponentEvent;import com.vaadin.flow.component.Component;import com.vaadin.flow.component.DomEvent;import com.vaadin.flow.component.EventData;import com.vaadin.flow.component.ComponentEventListener;public class ComponentCloseEvent extends ComponentEvent {    public ComponentCloseEvent(CustomDialog source, boolean fromClient) {        super(source, fromClient);    }}

然后,在 MainView 的 onAttach() 方法中,将监听器添加到 UI 事件总线:

import com.vaadin.flow.component.Component;import com.vaadin.flow.component.UI;import com.vaadin.flow.component.button.Button;import com.vaadin.flow.component.dialog.Dialog;import com.vaadin.flow.component.orderedlayout.VerticalLayout;import com.vaadin.flow.router.Route;import com.vaadin.flow.component.ComponentUtil;import com.vaadin.flow.server.VaadinSession;import com.vaadin.flow.shared.Registration;import com.vaadin.flow.component.AttachEvent;@Route("")public class MainView extends VerticalLayout {    private CustomDialog customDialog;    public MainView() {        customDialog = new CustomDialog();        add(customDialog);    }    @Override    protected void onAttach(AttachEvent attachEvent) {        UI ui = attachEvent.getUI();        ui.getSession().setAttribute("mainView", this);        Registration registration = ui.addDetachListener(detachEvent -> {            ui.getSession().removeAttribute("mainView");        });        ui.getSession().setAttribute("registration", registration);        ui.addClickListener(e -> {            System.out.println("UI Clicked");        });        addListener(ComponentCloseEvent.class, e -> {            System.out.println("I listened to the event!");            Button openDialogButton = new Button("Open Dialog");            openDialogButton.addClickListener(event -> {                customDialog.open();            });            add(openDialogButton);        });    }    public <T extends ComponentEvent> Registration addListener(Class eventType,                                                                  ComponentEventListener listener) {        return ComponentUtil.addListener(UI.getCurrent(), eventType, (ComponentEventListener) listener);    }}

接下来,在 CustomDialog 组件中,使用 ComponentUtil.fireEvent() 方法触发事件:

import com.vaadin.flow.component.Component;import com.vaadin.flow.component.ComponentUtil;import com.vaadin.flow.component.button.Button;import com.vaadin.flow.component.dialog.Dialog;public class CustomDialog extends Dialog {    public CustomDialog() {        setHeaderTitle("Custom Dialog");        add("This is a custom dialog.");        add(createCloseButton());        setCloseOnEsc(false);        setCloseOnOutsideClick(false);    }    private Button createCloseButton() {        return new Button("Close", e -> {            ComponentUtil.fireEvent(UI.getCurrent(), new ComponentCloseEvent(this, true));            close();        });    }    @Override    public void open() {        super.open();    }}

在这个例子中,当 CustomDialog 组件的关闭按钮被点击时,会触发 ComponentCloseEvent 事件。MainView 组件监听这个事件,并在事件发生时打印一条消息。

注意事项

确保在组件附加到 UI 之后再添加监听器。这可以通过在 onAttach() 方法中添加监听器来实现。使用 ComponentUtil.fireEvent() 方法触发事件,并确保传入正确的 UI 实例。为了防止内存泄漏,在组件分离时移除监听器。这可以通过在 onDetach() 方法中移除监听器来实现。或者使用 UI.addDetachListener()

总结

通过使用 Vaadin UI 事件总线,可以方便地在多个组件之间监听事件,实现组件间的解耦和灵活通信。这种方法可以用于各种场景,例如在主视图中监听来自对话框组件的事件,并在事件发生时执行相应的操作。

以上就是使用 Vaadin UI 事件总线在多个组件间监听事件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/937207.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月29日 16:02:58
下一篇 2025年11月29日 16:09:26

相关推荐

  • Laravel Horizon中processes配置项如何影响队列处理速度?

    深入剖析 Laravel Horizon 中 processes 配置项对队列处理速度的影响 Laravel Horizon 用于管理队列,其中 processes 配置项至关重要。本文将详细解释该配置项的作用,并阐述为何增加其值通常能提升队列处理速度。 以下是一个示例配置: ‘environmen…

    2025年12月10日
    000
  • Laravel Horizon中processes配置如何影响队列处理速度?

    Laravel Horizon: 深入理解 processes 配置对队列处理速度的影响 Laravel Horizon 是一个强大的队列工作器管理器,用于监控和管理队列作业。其配置中的 processes 参数至关重要,本文将详细解释其作用以及如何调整以优化队列处理速度。 以下是一个示例配置: ‘…

    2025年12月10日
    000
  • ThinkPHP 5.* 数据库填充失败:php think seed:run 命令无效怎么办?

    *ThinkPHP 5.框架数据库填充命令php think seed:run失效的解决方法** 在使用ThinkPHP 5.*框架时,执行php think seed:run命令进行数据库填充可能会遇到问题。这通常是由于数据库配置错误或权限不足引起的。 排查步骤: 验证数据库配置: 打开confi…

    2025年12月10日
    000
  • 如何将PPT转换为HTML5格式并保留视频和动画?

    ppt转html5,保留视频和动画的解决方法 问题:如何将ppt文档转换为html5格式,并保留其内部的视频和动画效果? 答案: 使用ppt导出为html 打开ppt文档。点击“文件”菜单。选择“导出”。在“导出为”选项中选择“html”。 注意:该方法仅适用于简单的ppt文档,无法保留复杂的动画和…

    好文分享 2025年12月10日
    000
  • 使用JetBrains教育许可证开发商业项目:风险有多大?

    使用JetBrains教育许可证开发商业软件的风险与责任 利用JetBrains教育许可证进行商业项目开发存在显著风险,本文将详细分析这些风险及应对策略。 许可协议的限制 JetBrains教育许可证明确禁止将开发的软件用于商业或盈利目的。违反此协议将带来法律风险。 规模与风险的关系 小型初创企业可…

    2025年12月10日
    000
  • 使用JetBrains教育许可开发商业项目:风险有多大?

    JetBrains教育许可与商业项目开发:风险分析 部分企业利用JetBrains开发工具(例如PhpStorm、IDEA)的教育许可开发商业项目。然而,此举存在潜在法律风险,务必谨慎。 JetBrains教育许可条款明确禁止将使用该许可开发的代码用于商业盈利活动。若企业以此类代码获利,则构成违约。…

    2025年12月10日
    000
  • 教育版许可开发商业项目:风险有多大?如何规避?

    JetBrains教育版许可用于商业项目:风险评估与解决方案 部分企业利用JetBrains教育版许可开发商业项目,此举存在显著风险。本文将分析其潜在影响,并提供相应的规避策略。 教育版许可的限制与违规后果 JetBrains教育版许可明确规定禁止用于商业盈利活动。任何基于教育版许可开发的商业项目都…

    2025年12月10日
    000
  • 白天夜晚模式切换后刷新页面就失效了,如何解决?

    白天/夜晚模式切换失效的解决方法 本文将解决白天/夜晚模式切换后刷新页面失效的问题。 问题在于,模式设置没有持久化保存,刷新页面后丢失了之前的选择。以下提供一种改进方案,利用cookie存储模式设置,并在页面加载时读取cookie恢复模式。 问题描述: 一个白天/夜晚模式切换按钮,刷新页面后,选择的…

    2025年12月10日
    000
  • 使用JetBrains教育许可证开发商业项目,会面临哪些风险?

    使用JetBrains教育许可证开发商业应用的风险分析 在企业级项目中使用JetBrains教育许可证存在诸多法律风险,务必谨慎。 违反许可协议 教育许可证明确禁止将基于其开发的软件用于商业用途或营利活动。 任何商业化行为,例如软件销售或商业交易,都将构成违反许可协议。 许可证合规性审查 虽然Jet…

    2025年12月10日
    000
  • PHP数组如何高效地添加子数组?

    高效php数组操作:向数组添加子数组的多种方法 本文将探讨在PHP中高效添加子数组到现有数组的几种方法,并比较其优缺点。 下图展示了本文将讨论的几种方法的对比。 方法一:使用foreach循环 这是最直观的方法,适合处理各种类型的子数组。 立即学习“PHP免费学习笔记(深入)”; $mainArra…

    2025年12月10日
    000
  • MySQL正则替换:如何用REGEXP_REPLACE()删除“@&”及其后的内容?

    MySQL REGEXP_REPLACE() 函数实现特定字符串及后续内容的正则替换 本文介绍如何使用MySQL的REGEXP_REPLACE()函数,删除字段中“@&”及其后的所有内容。 需求:需要处理包含如下格式数据的字段: 123@&baidugoogle@&sohu …

    2025年12月10日
    000
  • 阿里云Redis订阅失败?PHP Redis扩展版本该怎么选择?

    PHP Redis扩展版本与阿里云Redis订阅问题 在使用PHP连接阿里云Redis时,您可能会遇到订阅命令失效的情况。例如,使用PHP Redis扩展4.2.0版本在本地测试正常,但在阿里云环境下却无法订阅消息。 阿里云Redis订阅兼容性限制 这通常是因为阿里云Redis对Redis扩展版本有…

    2025年12月10日
    000
  • 如何设计MySQL+PHP商城每周抽奖活动及奖金分配统计系统?

    基于MySQL和PHP的商城每周抽奖活动及奖金分配统计系统 本文阐述一个设计方案,用于实现商城每周抽奖活动,并对奖金进行统计和分配。 系统需求: 该系统需满足以下功能需求: 立即学习“PHP免费学习笔记(深入)”; 参与资格: 每周交易次数达到10次的用户方可参与抽奖。奖金分配: 当期奖池的50%按…

    2025年12月10日
    000
  • 高并发抢红包如何保证金额分配的唯一性?

    高并发抢红包:优化红包金额读取并发问题 高并发抢红包场景下,数据库并发读取红包金额可能导致数据不一致。为确保金额分配的唯一性,一种方案是利用Redis List的LPOP命令的原子性,将红包金额预先存入List中,抢红包时执行LPOP弹出操作。 该方案优势: LPOP操作原子性,避免重复弹出同一金额…

    2025年12月10日
    000
  • 阿里云Redis订阅命令无法使用的原因是什么?

    阿里云Redis订阅命令失效的可能原因及解决方法 在阿里云Redis环境下,订阅命令无法正常工作,可能由以下几个因素造成: 1. PHP Redis扩展版本过低: 阿里云Redis支持PHP Redis扩展7.2.0及以上版本。如果您使用的是4.2.0版本或更低版本,请立即更新到最新稳定版本。 2.…

    2025年12月10日
    000
  • MySQL中如何用正则表达式替换特定字符串及其后内容?

    MySQL正则表达式替换:删除特定字符串及后续内容 本文介绍如何在MySQL中使用正则表达式替换特定字符串及其之后的所有内容。例如,数据库字段中以“@&”分隔的数据,可以使用regexp_replace函数进行处理。 regexp_replace函数用法: regexp_replace(目标…

    2025年12月10日
    000
  • 阿里云Redis订阅命令失效:如何解决PHP Redis订阅失败问题?

    阿里云Redis订阅失败排查指南 在阿里云Redis环境下,使用PHP Redis 4.2.0扩展进行消息订阅时,可能遇到订阅失败的情况,而本地环境却正常工作。本文将指导您排查并解决此问题。 关键问题及解决方案: 1. Redis版本兼容性: 立即学习“PHP免费学习笔记(深入)”; 阿里云Redi…

    2025年12月10日
    000
  • Java免签支付App监控代码如何添加“你已成功收款”消息的检测功能?

    增强Java免签支付App监控代码,实现“你已成功收款”消息检测 现有代码能够识别支付宝收款通知栏中“某某人通过扫码收款”类型的消息,但无法识别“你已成功收款”类型的消息。 为了解决这个问题,只需在代码中添加一个简单的判断条件: if (v0.contains(“通过扫码向你付款”) || v0.c…

    2025年12月10日
    000
  • MySQL字符查询不准确:字符集和排序规则如何影响搜索结果?

    MySQL字符集差异导致查询结果不精确 在MySQL数据库中,字符查询不精确的问题通常源于字符集设置的差异。例如,搜索“竹”字时,结果中可能意外包含“⺮”字。这是因为MySQL数据库默认的字符集和排序规则可能将这两个字识别为相同字符。 造成此现象的原因在于排序规则。排序规则决定了字符的排列顺序。My…

    2025年12月10日
    000
  • CI框架中如何异步渲染移动端列表页的分类新闻?

    使用CI框架异步加载移动端分类新闻 本文介绍如何利用CodeIgniter (CI)框架实现移动端列表页分类新闻的异步加载,提升用户体验。 实现步骤: 前端 (JavaScript): 为每个分类标题添加点击事件监听器,并将分类ID作为参数传递。使用AJAX向后端发送请求,获取指定分类的新闻数据。 …

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信