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

php cdi

在愉快地围绕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组件和模型之间实现绑定。 这个想法是在应该进行数据更新时触发自定义事件,而不是直接修改数据。 控制器观察触发的事件并根据事件数据执行操作。 然后,这些操作将操纵数据模型,并将有关数据更新的通知发送到视图。 参见下图:

摇摆式CDI-MVC

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

php cdi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java关闭窗口函数_2016年将是Java终于拥有窗口函数的那一年!

java关闭窗口函数你没听错。 到目前为止&#xff0c;出色的窗口功能是SQL独有的功能。 甚至复杂的函数式编程语言似乎仍然缺少这种漂亮的功能&#xff08;如果我错了&#xff0c;请纠正我&#xff0c;Haskell伙计们&#xff09;。 我们撰写了许多有关窗口函数的博客文章&#…

jvm gc阻塞时长 占比_jvm进行转义分析需要多长时间? 可能比您想象的要长。

jvm gc阻塞时长 占比这篇文章着眼于转义分析&#xff0c;特别是jvm在运行的程序中执行转义分析需要多长时间。 我做了一些观察&#xff0c;但目前还没有全部解释。 作为介绍&#xff0c;让我们绕道看看jvm -Xcomp中一个鲜为人知且使用更少的标志&#xff08;我们将看到这是一件…

jquery mysql php_jQuery+PHP+Mysql在线拍照和在线浏览照片

本文示例建立在本站helloweba.net两篇文章之上&#xff0c;一篇是用于在线拍照的&#xff1a;JavascriptPHP实现在线拍照功能&#xff0c;另一篇是用于浏览照片的&#xff1a;Fancybox丰富的弹出层效果。如果您对在线拍照和Fancybox不大了解&#xff0c;可以先参照以上两篇文章…

设计散列表实现通讯录查找系统_[源码和文档分享]利用哈希表实现电话号码查询系统...

第一章 需求分析1.1 问题描述设计一个电话号码查询系统&#xff0c;为来访的客⼈提供各种信息查询服务。1.2 基本要求设计每个记录有下列数据项&#xff1a;电话号码、用户名、地址从键盘输入个记录&#xff0c;分别以电话号码和用户名为关键字建立不同散列表存储采用一定的方法…

C++基础(2)

【1】静态全局变量 1.通常情况下&#xff0c;静态全局变量的声明和定义放在源文件中&#xff0c;并且不能使用extern关键字将全局静态变量导出&#xff0c;作用域仅限于定义静态全局变量的文件内部。 2.如果头文件中声明静态全局变量&#xff0c;在声明的同时会被初始化&…

drill apache_使用Apache Drill REST API通过Node构建ASCII仪表盘

drill apacheApache Drill有一个隐藏的瑰宝&#xff1a;易于使用的REST接口。 该API可用于查询&#xff0c;分析和配置Drill引擎。 在此博客文章中&#xff0c;我将解释如何使用Brilled Contrib使用Drill REST API创建ascii仪表板。 ASCII仪表盘如下所示&#xff1a; 先决条…

mysql 8.0用doc修改密码_MYSQL8.0修改密码流程

MYSQL8.0修改密码流程1.以管理员身份打开cmd2.找到mysql 的安装路径bin文件的路径&#xff0c;3.输入net start mysql4.输入mysql -u root -p5.找到my.ini文件6.在my.ini里面的[mysqld]这一行后面添加 skip -grant-tables,保存文件&#xff0c;注意不是[mysql]7.输入mysqld --s…

颜色空间缩减color space reduction

颜色空间缩减公式 //---------------------------------【头文件、命名空间包含部分】-------------------------- // 描述&#xff1a;包含程序所使用的头文件和命名空间 //---------------------------------------------------------------------------------------…

运动基元_发现大量Java基元集合处理

运动基元在阅读博客文章5减少Java垃圾收集开销的技巧时 &#xff0c;我想起了一个名为Trove的小型Java收集库&#xff0c;该库“为Java提供了高速的常规和原始收集”。 我对将Trove应用到允许原语的集合而不是要求集合中的元素成为完整的引用对象的能力特别感兴趣。 我在这篇文…

python判断奇偶数字符串的拼接_Python字符串拼接方法总结

这篇文章主要介绍了Python字符串拼接的几种方法整理的相关资料,这里提供了五种方法及实现&#xff0c;需要的朋友可以参考下Python字符串拼接的几种方法整理第一种 通过加号()的形式print(第一种方式通过加号形式连接 &#xff1a; lovePython \n)第二种 通过逗号(,)的形式pr…

Split分离通道

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2\opencv.hpp> using namespace cv; using namespace std;int main() {vector<Mat>cha;Mat b, g, r,dst;//1.加载两幅图片…

上下文异常中的上下文属性_在没有适当上下文的情况下引发异常是一种不良习惯...

上下文异常中的上下文属性Allison Anders等人的《四个房间》&#xff08;1995&#xff09;。 我不断重复同样的错误。 因此&#xff0c;该停止并制定规则以防止这种情况了。 错误不是致命的&#xff0c;但很烦人。 当查看生产日志时&#xff0c;经常会看到类似"File does…

最大公约数简便算法_求最大公约数的4种算法

for(z0; z<10000000; z) 循环只是为了增加程序的运行时间&#xff0c;让我们体会算法的时间复杂度。算法一&#xff1a;短除法想法&#xff0c;采用短除法找出2个数的所有公约数&#xff0c;将这些公因子相乘&#xff0c;结果就是2个数的最大公约数。【找公因子&#xff0c;…

java 编写代码_如果您在2015年编写过Java代码-这是您不容错过的趋势

java 编写代码去年我们有机会遇到的最有趣趋势的实用概述 在这篇文章中&#xff0c;我们回顾了构成我们2015年对话的5个主题和新发展。与其他许多年终总结保持较高水平的不同&#xff0c;我们将做一个更实际的操作不用流行语 。 好吧&#xff0c;没有太多*流行语。 与往常一样…

java自动生成合同_Java 7和Java 8之间的细微自动关闭合同更改

java自动生成合同Java 7的try-with-resources语句和与该语句一起使用的AutoCloseable类型的一个不错的功能是&#xff0c;静态代码分析工具可以检测到资源泄漏。 例如&#xff0c;Eclipse&#xff1a; 当您具有上述配置并尝试运行以下程序时&#xff0c;您将收到三个警告&…

Python学习(1)

1.str字符串操作 len(str) 计算字符串长度 str.replace(xxx,xxxx) 替换指定字符 str.upper()字符串转大写 str.lower()字符串转小写 str.strip()删除左右多余的空格 str.lstrip()删除左边多余的空格 str.rstrip()删除右边的空格 format(a,b,c) 传参显示 2.索引 out hello wo…

opencv求两张图像光流_光流(optical flow)和openCV中实现

转载请注明出处&#xff01;&#xff01;&#xff01;光流(optical flow)和openCV中实现光流的概念&#xff1a;是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度。是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一…

storm apache_Apache Storm的实时情绪分析示例

storm apache实时情感分析是指处理自然语言文本&#xff08;或语音&#xff09;流以提取主观信息。 琐碎的用例用于构建推荐引擎或查找社交媒体趋势。 我选择了Apache Storm作为实时处理引擎。 Storm非常强大&#xff08;我们正在生产中使用它&#xff09;&#xff0c;并且非常…

怎么用python画圆的公式_怎么用python画圆

python中内置了许多第三方库&#xff0c;来帮助它完成各种功能。Turtle库就是Python语言中一个很流行的绘制图像的函数库(推荐学习&#xff1a;Python视频教程)Turtl库用于绘制线、圆、其他形状或者文本这个库被介绍为一个最常用的用来给孩子们介绍编程知识的方法库&#xff0c…

嵌入式java基准测试_Java正则表达式库基准测试– 2015年

嵌入式java基准测试在尝试使Java在计算机语言基准游戏的regexdna挑战中排名第一时&#xff0c;我正在研究Java正则表达式库的性能。 我可以找到的最新网站是2010年的tusker.org 。因此&#xff0c;我决定使用Java Microbenchmarking Harness重做测试并发布结果&#xff08;破坏…