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的形式,它本身完全不是太多的代码行。

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

php cdi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值