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,一经查实,立即删除!

相关文章

虽然你没有考入清华大学,但是如果你有对于计算机的向往!!!请看过来

本文分享来自清华大学计科的课程&#xff0c;希望对热爱计算机的人有帮助。 Github清华大学计算机课程

Mysql存储函数实现增删改查_使用存储过程操作数据库(实现增删改查)

使用存储过程操作数据库添加数据&#xff1a;--创建一个存储过程&#xff0c;向表中插入一条数据create proc usp_insertintoTbClassclassName nvarchar(50),classDes nvarchar(100)asbegininsert into TbClass values( ClassName,classDes)endexec usp_insertintoTbClass clas…

计算机实现数论 奇偶排列问题

#include <iostream> using namespace std;int main() {int sub 0;int a[5] {5,4,1,3,2};for (int i 0; i < 5; i){for (int j i 1; j <5; j){if (a[i] > a[j]){sub 1;}}}if (sub % 2 0)cout << "此排列是偶排列" << endl;else{…

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

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

mysql抓包_mysql抓包工具

简介MySQL Sniffer 是一个基于 MySQL 协议的抓包工具&#xff0c;实时抓取 MySQLServer 端或 Client 端请求&#xff0c;并格式化输出。输出内容包括访问时间、访问用户、来源 IP、访问 Database、命令耗时、返回数据行数、执行语句等。有批量抓取多个端口&#xff0c;后台运行…

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

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

atthesametime啥意思_eachother造句并翻译

each other造句As friends&#xff0c;we should help each other 。作为朋友&#xff0c;我们应该互相帮助。用ask each other来造句答&#xff1a;Ask each other and discuss it。帮我翻译一下 FRESH START We belong to each other这句子怎么样译?FRESH START We belong t…

conditional_如何:在Spring中使用@Conditional和Condition注册组件

conditionalSpring中的Profile批注可用于任何自动检测候选对象的Spring组件&#xff08;例如&#xff0c; Service Component&#xff0c; Service Component &#xff0c; Service Configuration等&#xff09;。 Profile批注接受单个配置文件或一组必须是活动的配置文件&…

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

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

java 字符串文字筛选_拜托,Java。 最终是否支持多行字符串文字

java 字符串文字筛选我了解Java语言的思想很难以向后兼容的方式进行维护。 我知道JDK API&#xff08;例如集合&#xff09;的想法很难打破。 是。 我不明白为什么Java 仍然没有多行字符串文字。 您多久编写一次这样的JDBC代码&#xff08;或您想要嵌入到Java中的任何其他外部…

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

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

C++基础(1)

【1】简述#include<>和#include" "的区别 答&#xff1a;前者直接从编译器指定的路径处搜索&#xff1b; 后者在程序当前的目录进行搜索&#xff0c;如果没有搜索到再从编译器指定的路径出搜索。 【2】简述##与#在define中的作用 答&#xff1a;1.宏定义中#…

java 存储数据到文件中_本机速度文件支持的“纯” Java大数据存储

java 存储数据到文件中动机 所有这一切始于意识到我买不起足够大的计算机。 音频处理需要大量的内存。 Audacity是一款出色的免费音频处理器&#xff0c;它使用文件支持的存储系统对其进行管理。 这是解决此类问题的常用方法&#xff0c;在这些问题中&#xff0c;我们存储大量信…

mysql每条sql以什么结束_一条 SQL 查询语句是如何执行的?

一条 SQL 查询语句是如何执行的&#xff1f;比如&#xff0c;你有个最简单的表&#xff0c;表里只有一个ID字段&#xff0c;在执行下面这个查询语句时mysql> select from T where ID10;我们只看到一个输入语句&#xff0c;返回一个结果&#xff0c;却不知道这个 SQL 语句在 …

C++基础(2)

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

ROI区域图像叠加

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2\opencv.hpp> using namespace cv; using namespace std;int main() {//1.加载两幅图片Mat src imread("风景.jpg"…

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;包含程序所使用的头文件和命名空间 //---------------------------------------------------------------------------------------…