在享受了几年围绕CDI构建我的代码的乐趣之后,使用它根据众所周知的模式来构造我的代码非常自然。 CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利。 但是,我想证明它可以在Java SE应用程序中使用并且具有巨大的潜力。

CDI的优点在于,它不仅仅是注入机制。 除此之外,它还提供了一种优雅而强大的事件传递机制。 该功能可以与Swing很好地结合起来,以基于MVC模式构建GUI应用程序。

确实有可能有效地将CDI和Swing框架结合起来,以快速,清晰的结构来构建Java GUI应用程序。 请继续关注以了解如何…

首先,称为Weld的CDI的参考实现也作为单独的库分发。 您可以将其添加到您的项目中并开始使用它。 与运行应用程序的标准方式唯一的不同是,您需要启动一个Weld容器,它很简单:

import org.jboss.weld.environment.se.StartMain;
...public static void main(String[] args) {   StartMain.main(args);}

要将Weld添加到您的Maven应用程序中,只需添加以下依赖项: org.jboss.weld.se : weld-se : 2.2.9.Final 。 要执行您的应用程序代码,应将其放入观察ContainerInitialized事件的方法中:

public void start(@Observes ContainerInitialized startEvent) {// code which would be usually in the main() method
}

在上面的方法中,您可以初始化应用程序,构建并显示GUI,然后等待Swing事件。

从这里开始有趣的部分。 我将使用CDI事件机制使用观察者模式在Swing组件和模型之间实现绑定。 这个想法是在应该进行数据更新时触发自定义事件,而不是直接修改数据。 控制器观察触发的事件并根据事件数据执行操作。 然后,这些操作将操纵数据模型,并将有关数据更新的通知发送到视图。 参见下图:

MVC周期从Swing动作侦听器开始,该动作侦听器构成一个动作对象并将其作为CDI事件发出。 动作侦听器未绑定到任何控制器代码–控制器已使用CDI机制绑定到事件。 这将GUI代码与业务逻辑完全分离。 以下代码段响应按钮单击事件,并发出一个向计数器添加值的操作:

@ApplicationScoped
class MainFrame extends javax.swing.JFrame {@Inject Event<ChangeValueAction> changeValueAction;
...void addButtonActionPerformed(java.awt.event.ActionEvent evt) {changeValueAction.fire(ChangeValueAction.plus(getValue()));}
...
}

在这里,我们需要记住,CDI事件的观察者将被创建为所有触发事件的新对象以及所有依赖项。 我对MainFrame使用了@ApplicationScoped ,以确保所有代码都在相同的实例上运行。

这里要提到的一件事:为了使CDI工作,必须由CDI创建MainFrame的实例,而不是直接使用其构造函数。 这是通过将其注入到已经存在的bean中实现的,例如观察启动时发出的ContainerInitialized事件的bean。

CDI机制将事件分派给任何侦听器方法,该方法侦听此类事件。 我们创建一个控制器应用程序,并将代码放入观察者方法中,如下所示:

public class Application {
...public void updateValueWhenChangeValueAction(@Observes final ChangeValueAction action) {... // controller action}
...
}

最后,控制器更新模型并在必要时触发视图更新。 如果进一步讲,我们可能会触发控制器的更新事件,该事件将由视图(在本例中为MainFrame组件)观察到。 甚至构建模型,该模型在更新时会自动触发CDI事件。 因此,控制器和视图将完全分离,仅响应事件-GUI事件从View到Controller方向流动,数据更新事件从Controller / Model到View流动。总而言之,CDI事件机制对于构建非常方便一个View与业务逻辑分离的MVC Swing应用程序。 这可以通过在Weld CDI容器中运行应用程序(1行代码),从Swing侦听器触发动作(2行代码)并观察动作(在任何启用CDI的类上使用单个方法)来实现。 这些动作采用一种数据Bean的形式,它本身完全不是太多的代码行。

  • 可以在github上找到完整的示例: https : //github.com/OndrejM/JavaDecoupledUI-CDI

翻译自: https://www.javacodegeeks.com/2016/02/cdi-events-swing-application-decouple-ui-event-handling.html

Swing应用程序中的CDI事件可将UI与事件处理分离相关推荐

  1. php cdi_Swing应用程序中的CDI事件将UI和事件处理分离

    php cdi 在愉快地围绕CDI构建我的代码几年之后,使用它根据众所周知的模式来构造我的代码非常自然. CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利. 但是 ...

  2. Swing应用程序中的JavaFX 8 DatePicker

    1.概述 本文显示了一个使用JavaFX 8 DatePicker控件的Java SE 8 Swing应用程序的示例. DatePicker控件允许用户以文本形式输入日期或从日历弹出窗口中选择日期. ...

  3. java swing暂停继续_如何在Java Swing应用程序中暂停/睡眠/等待?

    小编典典 Thread#sleep在 主 线程中的swing应用程序中使用method 会导致GUI冻结(因为该线程处于睡眠状态,因此无法发生事件).Thread#sleepSwing应用程序中的Sw ...

  4. 小程序 | 小程序中常用的事件 + 事件对象的属性列表 +小程序事件传参 + 小程序全局配置 + 小程序页面配置 + 小程序发起网络数据请求

    文章目录 一.WXML 模板语法 数据绑定 事件绑定 ⭐小程序中常用的事件 ⭐事件对象的属性列表 target 和 currentTarget 的区别 bindtap 的语法格式 在事件处理函数中为 ...

  5. 在J2SE应用程序中模拟CDI的会话和请求范围

    我们目前正在考虑将Naked Objects框架重构为使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI). 使用香草JSR-330是不费吹灰之力的,但是我们想利用JSR-299中 ...

  6. java swing 帮助文档,在Java Swing应用程序中创建在线帮助-使用pdf用户文档

    我正在尝试将一些用户文档链接到我的Java Swing应用程序.用户文档是pdf,我希望能够在应用程序中单击一个按钮,该按钮会打开某种pdf渲染器以显示我的userdoc.pdf. 我不想使用运行时e ...

  7. akka应用_处理Akka应用程序中的每个事件

    akka应用 这里的事件,那里的事件,到处都是事件. 发布有关检查每一项Akka事件最终都能找到归宿的信息. Akka和基于事件的React式应用程序是创建软件的新方法. 在当前基于Scala的项目中 ...

  8. 处理Akka应用程序中的每个事件

    这里的事件,那里的事件,到处都是事件. 发布有关检查每一项Akka事件最终都能找到归宿的信息. Akka和基于事件的反应式应用程序是创建软件的新方法. 在当前基于Scala的项目中,我们非常密集地使用 ...

  9. java语义事件的含义_Java基础之处理事件——应用程序中的语义事件监听器(Sketcher 5 with element color listeners)...

    控制台程序. 为了标识元素的类型,可以为菜单已提供的4中元素定义常量,用作ID.这有助于执行菜单项监听器的操作,还提供了一种标识颜色类型的方式.我们会累积许多应用程序范围的常量,所以把它们定义为可以静 ...

最新文章

  1. Linux redhat 5.4上安装MYDNS
  2. 删除git中无用的大文件
  3. mycat schema.xml 配置文件详解
  4. 学考语言成绩c对高考有影响吗_学考成绩会影响高考录取吗?2021年广东高中学考...
  5. C++(二)——命名空间(上)
  6. vue2.0-axios is defined
  7. 【iOS开发】添加评分功能
  8. 【源码】2012年斗地主结构算法公布(斗地主结构算法)
  9. 很漂亮个人主页自带音乐源码
  10. 字符串第一个出现的单个字符_如何在不编写单个应用程序的情况下找到我的第一个开发人员工作
  11. Oracle SGA优化
  12. Pentium的指令系统(2)——Pentium的指令系统
  13. 解析ip分组_快来看看!!!你经常忽略的TCP/IP知识点~
  14. python获取post请求中的所有参数_Django从POST reques获取请求参数
  15. android录音相关
  16. Web 2.0下一个版本是什么 3.0就要到来了吗?
  17. 蓝桥杯省赛2015年——奇妙的数字
  18. 利用Global Mapper处理正摄卫片
  19. matlab的grid网格线属性设置,修改网格线密度
  20. 博取仪器3D产品配置

热门文章

  1. Oracle入门(十一)之SQL
  2. 班级日常分享 | 一天一瞬间!
  3. 切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道
  4. 属于你们的“礼仪小课堂”
  5. sql server操作案例
  6. hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice
  7. android:background大小,小Demo小知识-android:foreground与android:background
  8. 区间数多属性决策matlab,区间数多属性决策的改进理想解法
  9. rpa文件怎么提取内容_怎么编辑pdf文件内容?有什么软件可以编辑pdf文件吗?
  10. Ubuntu下apt-get方式Git的安装、配置和更新