Swing程序最佳架构设计—以业务对象为中心的MVC模式

java swing 布局所需组件formlayout所需jar包 GUI FormLayout java swing 布局所需组件formlayout所需jar包 jgoodies-common-1.6.0 jgoodies-forms-1.7.2 本人在烽火期间,使用的就是FormLayout布局,简单易用、功能强大,适用于swing企业和感兴趣的Java可视化兴趣爱好者。如果是流式布局、网格布局、网格包布局都非常麻烦。 这个资源非常稀缺,希望能帮助到大家,本人也是花两天时间整理处理的。 立即下载
前言:
我打算写一系列关于Swing程序开发的文章。这是由于最近我在做一个Swing产品的开发。长期做JavaEE程序,让我有些麻木了。Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的产品!
有机会作Swing软件的开发,让我非常有感觉!
呵呵,希望有机会能够用Java3D编写软件,那种感觉一定更棒!
Java和Swing都是杰作。我这个人对别人一向很挑剔的,能够得到我由衷地赞誉,可想而知它们有多优秀了。奇怪的是,它们居然一直都无法占领桌面市场。有人说这是技术的原因。我认为这应该是商业、历史的原因才对。
好了,我也应该为java和Swing在桌面的成功尽我绵薄之力,共享我的思想吧!以感谢这么多年来,Java带给我的美好回忆。
台灯、电脑、Java,还有Coffee,伴我度过多少不眠之夜!I love U!
 
 
 
Swing程序最佳架构设计之一
                       业务模型中心架构模式
 
以业务模型为中心
以业务模型为中心的架构模式。这是Swing和其他所有程序应该采用的架构模式。之所以强调Swing,是因为在Swing程序中使用这种“以业务模型为中心”的架构模式,更有意义,作用更大!
我们知道,一个软件由几个部分组成:
1,表现层(用户界面层)
这时软件和用户交互的部分,可以分为字符界面(DOS等命令行),GUI图形界面(桌面GUI,浏览器GUI,三维界面)等。
这仅仅是软件的外表,外貌再华丽,也不能说明软件的优劣!Google的界面平淡无奇,但它确是今天最强大的软件!
 
2,业务层
这是实现软件功能的地方。存在着大量映射着业务领域的对象,存在着复杂的业务计算。这才是软件真正工作的地方。
软件的核心和难点就在这里!巨大的开发工作量和思考,也都集中在这里。
业务模型,及其互相之间的交互,这才是软件的核心!
 
3,数据库访问层(可能有)
有些软件需要把操作保存进数据库,永久保留下来。通常,企业级等需要业务数据的软件需要这个模块。
它实现业务对象和关系型数据库的映射。称为“O-R”映射。
 
4,持久化层(可能有)
有些软件不把数据保存进数据库,而是保存为文件。如,二进制文件,文本文件,XML文件等。
它实现业务对象和文件之间的映射。可能是序列化业务对象。如果是保存为xml文件,我们称它为O-XML映射,是业务对象和XML文件之间的映射。
现在有一些开源软件实现了Java对象和XML文件之间的映射,就如同是O-R映射一样。其实,基于Java的XML访问组件,自己开发O-XML映射也是非常简单的,我自己也写了一个这样的库。
 
可以看到,“以业务模型为中心”,并不是一种特例,而是最基本的软件开发规律!是所有软件共有的基本特性。只是,今天,在各自不同的领域,这个基本常识被一些常用的领域中的架构模式所模糊了。
如,在Java的企业级软件开发中,大家都知道J2EE软件分为3层:
1,表现层
2,业务层-----业务对象和Service助手类
3,数据库访问层-----DAO助手类
这样的架构模式,模糊了“业务对象”是整个软件的核心这样一个事实。
Service助手类和DAO助手类,实际上都是业务对象的一部分,完全可以被放在业务类中。
助手类和业务对象分离,不过是一种设计模式而已。
 
 
Swing程序中的应用
好了,本文并不想讨论这些“形而上学”的问题。上面的讨论,不过是想让你明白,本文所论述的“以业务模型为中心”的架构模式,并不是Swing应用程序所特有的,而是所有软件的特性,只是,在Swing这个条件优越的桌面开发环境中,更加有用罢了!
 
Swing程序作为桌面程序,拥有比JavaEE程序更好的环境,更强的功能。
Swing程序常常是单机的,即使是网络化的,也可以在业务层中实现分布式,而不像JavaEE程序,用户界面和响应用户操作的代码都是分布在不同的机器上的!
因此,Swing程序更能发挥我们软件开发者的智慧和能力!
 
 
Swing程序最佳架构设计之二
                       MVC模式
 
 
Swing程序的组成
一般,Swing程序由以下几部分组成:
1,表现层----Swing组件组成的GUI
2,业务层------业务对象,及其相互之间的关系
3,持久化层-----把业务对象保存为文件,或者是数据库记录。
MVC模式在Swing程序中的应用
我们知道,Swing是MVC模式的典范。Swing的各个可视化组件都使用MVC模式来设计。
Swing组件一般由三个部分组成:
1,Swing的Model,这是MVC中的M—模型部分。它保存了Swing组件所需要的数据。Swing组件的UI需要根据它来展现。
2,Swing的UI类。这是MVC模式的View—视图部分。它根据组件的Model中的数据,执行绘制、展现Swing组件的任务。
3,Swing组件类。这是“门面”,它封装了Swing的UI对象和Model对象。我们一般都是通过它来操纵Swing组件,不会直接使用Swing组件内部的UI对象和Model对象。
Swing组件之间,还有着复杂的关系。Swing的UI类,监听Model对象的数据改变,即时进行重绘界面的工作。
在Swing组件上还可以注册一系列的事件监听器。它们就是MVC模式中的Controller控制器。
 
Swing应用程序中使用MVC模式
一个Swing应用程序的GUI由很多个Swing组件组成。各个Swing组件本身是由MVC模式设计的,而我们的整个Swing应用程序的表现层也应该由MVC模式设计。
使用MVC模式,能够更好地分离代码和数据。使整个应用的表现层部分,更加低耦合、高内聚,灵活度更高。
在Swing应用程序的编写过程中,我们需要使用Swing组件的2个部分:
1,Swing组件的Model。Swing组件的MVC模式设计,使整个Swing组件是以Model为核心的。通过更改Model,我们就能够即时改变Swing组件的UI外观。
2,Swing组件上注册事件监听器。这是Swing组件的控制器,也可以作为整个Swing程序的控制器之一。
    在Swing组件的监听器中,我们可以响应用户的操作,作为整个程序功能的入口。在这里,我们可以调用业务层的代码进行业务计算。计算完毕之后,可以修改Swing程序的外观。常常是修改某个Swing组件的Model。
    Swing组件的监听器,一般是使用Swing程序的内部类来实现的。因此,我们可以在控制器中完全使用整个Swing程序的所有资源!因此,Swing组件的控制器是足够足够强大的!
 
此Model非彼Model
读者应该对JavaEE比较熟悉吧。毕竟,今天Java的主战场是在企业级应用上,会java,而不懂javaEE,这就有点说不过去了。
这里,我以大家比较熟悉的JavaEE的表现层技术来说明Swing程序的MVC设计。
Struts中,其MVC由以下几部分组成:
1,View视图,就是使用Struts标签的JSP页面。
2,Controller控制器,就是响应用户操作的Action。
3,Model模型,就是用户html页面表单中提交的数据。这在Struts中被称为“form”表单。
HTML表单的数据,都是String型的,而我们的业务对象的属性,却未必都是String型的。因此,在Struts应用程序中,我们需要根据接收到的form对象,构造业务对象。
在SpringMVC中,提供了一个机制,可以帮助我们自动把表单数据转为业务对象。对于一些特殊的类型转换,还是需要我们手工提供转换。
Form和业务对象之间的自动转换,固然是提高了开发效率。但是,我们必须要明白,GUI组件中的数据Form和业务对象是截然不同的两种东西。2者碰巧一样,或者可以自动转换,只是特例。它们本质上还是两样截然不同的东西。
Form是表现层的数据容器,而业务对象则是来自于特定业务的对象。Form的数据类型,变化不多,而业务对象的数据类型,那就是千变万化了。
因此,Form对象类型和业务对象类型一致,这是少之又少的特例。
 
Swing程序中的表单数据(Form)和业务对象(Model)
Web应用程序中的表单数据form,是来自于Html的表单的各个项的数据,都是String类型。
Swing程序中的表单数据Form。是由Swing程序的各个Swing组件的Model组成的。其各个部分的数据类型非常不同。
如,最简单的文本框JTextField的Model,是 javax.swing.text.Document类型的对象。这个对象,我们也可以直接得到或设置String的值来作为Model。实际上这个String类型的数据,是Document的属性。
还有,如JTree组件的Model是TreeModel对象。
因此,Swing程序中的表单数据Form的类型是非常多的。显然,我们的业务对象不大可能和Swing的Form数据的类型一致。
因此,Swing程序的表现层的数据Form和业务对象Model之间的转换,必然要由我们自己去实现。不大可能直接把Form作为业务对象扔到业务层中使用。也不可能直接在Swing的GUI中显示业务对象的数据!
 
Swing程序的MVC模式的使用
整个Swing程序应该这样使用MVC模式:
1,JFrame或者其他顶层容器中,由各个Swing组件构成了View视图层。用来展现数据,提供用户操作的图形界面。
 
2,一个或者一组业务对象是Model。它们存放了Swing组件要显示的数据。它们是业务对象,因此,可以直接在业务层代码中使用,执行复杂的业务计算。
它们不能直接在Swing组件中显示。而是需要根据业务对象,构造Form对象,也就是Swing组件的Model来展示数据。
为了让View—Swing组件实时展现业务对象的数据,我们需要让Swing组件监听业务对象,一旦业务对象发生改变,就重新根据新的数据,构建新的Swing组件的Model,从而在Swing组件上展现最新的业务对象数据。
这里,我们使用 ChangeListener 改变监听器。
为了让业务对象能够得到用户最新输入的数据,我们还需要将业务对象注册到Swing组件上。一旦Swing组件的数据发生了改变,就通知业务对象。业务对象根据Swing组件的Model,也就是Form对象的数据,修改业务对象的值。
为了实现这样的功能,我也使用了事件机制,实现了这一功能。这将在下文中论述。
现在,业务对象和Swing组件之间,通过双向的事件监听机制,实现了双向的引用!
 
3,在Swing各个组件上注册响应事件的监听器(控制器),以响应用户的操作。这些控制器,使用匿名内部类实现。
每一个Swing组件上的控制器,都不仅仅是该Swing组件的控制器,而是整个Swing程序的控制器。因为,内部类可以操纵整个Swing程序的所有资源,因此,我们可以在控制器中,使用所有Swing组件的form,也可以使用所有业务对象,调用所有业务方法,实现任何需要的功能!
控制器,是业务功能的入口点,它连接了Swing程序的表现层和业务层,连接了Swing的Form(Swing组件的Model)和业务对象。
 
现在,我们的Swing程序结构清晰,功能区分合理,低耦合、高内聚,堪称是MVC模式的典范!
 
 
Swing组件和业务对象之间的互动关系
在上文中,我们提出了Swing组件和业务对象之间相互的事件监听机制。Swing组件监听业务对象,使用“观察者模式”的一种实现机制,ChangeListener改变监听器。当然,也可以使用Observe/Observable这样的机制,或者其它的事件机制。但是,经过权衡,我觉得还是ChangeListener最符合我的需要。它功能强大,又很简单。
当我们需要某个Swing组件监听我们的业务对象时,我们创建一个该Swing组件的子类,它实现ChangeListener接口,实现
public void stateChanged(ChangeEvent e){…}方法,根据监听的业务对象的数据,构建自己新的Model,从而改变本Swing组件的显示。
 
业务对象又该怎样监听Swing组件呢?
我钟爱ChangeListener,还是在Swing组件上注册一个ChangeListener监听器,这个监听器就是我们的业务对象。
但是,考虑到ChangeListener使用场合甚广,为了避免Swing组件的其他操作激发该事件,我参照ChangeListener接口,新建了一个类型的新接口:ControllerChangeListener接口。
现在,Swing组件上的数据就能够和我们的业务对象的数据保持同步了!Form和业务对象虽然类型不同,却好像是同一个对象,有着同样的数据!
 
采用MVC模式后的Swing程序的执行流程
1,用户可以看到一个Swing组件构成的GUI界面。
2,用户在界面上进行操作。
3,Swing组件的控制器被触发。
1)可能会激发ControllerChangeListener的事件,引起业务对象自动使用Swing组件的Model数据进行更新。
2)业务对象更新数据,又会激发业务对象上的ChangeListener的事件。这会引起所有监听业务对象其Swing组件更新其Model的数据,从而改变Swing组件的显示。
3)我们可能会针对业务对象,执行业务层代码,进行复杂的业务计算。得到新的业务对象的值。
    这同样会激发业务对象的ChangeListener事件,让Swing组件的Model得到更新,从而改变Swing组件显示的界面。
4)最后,当然,我们也可以直接修改某些Swing组件的Model或者外观。因为,作为内部类的控制器可以使用Swing程序所有的属性和方法。
所以,在这里的控制器中,我们应该使用SwingWorker这个助手类,把业务代码放在 public  Object construct() {…} 方法中执行,
而把直接修改 Swing 组件 UI 的方法,放到 public void  finished() {…} 方法中执行。这样, Swing 程序的交互性、响应能力和性能将大大提高!
 
可以看到,这里,通过将业务对象和Form对象(Swing组件的Model)关联起来,我们在Swing应用程序中只需要“以业务对象为中心”。操纵业务对象,执行业务操作即可。
Swing程序的用户界面,就会自动更新。
这就是采用“以业务对象为中心的MVC模式”的巨大优势!


原文链接:http://www.cnblogs.com/armlinux/archive/2007/02/05/2391035.html


java swing的mvc模式的简单框架 java swing的mvc模式的简单框架,应用了用观察者模式于gui和控制器之间,将gui作为一个对象传进控制器进行处理,这个简单框架的控制器那里还有待改进。这个代码中包含了使用框架的简单例子在里面 立即下载

相关推荐

表单布局实例

ExtJS布局之border实例 border布局是常见的布局样式,下面是一个实际项目的示例,比较简单,仅供初学者参考。   前两天遇到一个border布局的界面问题,如下: west是一个tree a,center是一个tree b和一个Panel,如下图   

实战 PureMVC

http://www.ibm.com/developerworks/cn/java/j-lo-puremvc/ 引言 MVC 是一个非常常见的设计模式,被广泛运用于各种和用户交互的软件中,像 java Swing 类库和 SWT、J2EE 中的 JSP、wxWidgets、QT 和 Gnome 等。可以很不夸张的说,几乎所有和 UI 有关的类库,不论什么语言,什么平台都或多或少有

hujunxing的专栏 301

swing 一个简单布局

自己写的而一个swing布局,很烂的主要是用于暂存

通过Java Swing看透MVC设计模式

一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的表现。例如,如果在您的面前摆放着一个类似于电脑键盘按键的一个简单的按钮,然而就是这么简单的一个按钮,我们就可以看出一个GUI设计的规则,它由两个主要的部分构成,一部分使得它具有了按钮应该具有的动作特性,例如可以被按下。另外一部分则负责它的表现,例如这个按钮是代表了A还是B。     看清楚这两点你就发现了一个很强大的设计方法,这种方

huoyingjianshen的专栏 845

14自由度汽车动力学模型

多体系统分解簧上质量刚体:包含车身主体,具有6个自由度(x/y/z平移 + 俯仰/侧倾/横摆旋转)四个簧下质量刚体:每个车轮独立建模,含垂直跳动(z向)和旋转(绕z轴)自由度总自由度:6(车身) + 4×2(车轮) = 14自由度。

chao189844的博客 1198

Python+ArcGIS实战:5步搞定土壤类型预测(附随机森林模型配置技巧)

本文详细介绍了如何结合Python与ArcGIS,利用随机森林模型进行土壤类型预测。通过5个核心步骤——数据预处理、样本创建、模型构建、空间预测与精度验证,构建了一套自动化、高精度的空间预测工作流,并提供了关键的模型配置与调参技巧,助力GIS开发者高效完成土壤制图任务。

weixin_29227585的博客 396

12.1 Swing与MVC设计模式

1 设计模式2 MVC模式模型-内容 视图-外观 控制-行为3 对Swing按钮的MVC分析

AnubisAwooo的博客 385

vins-mono保存、重载地图、evo工具测试

下面咱们来对vins-mono的重定位vins-mono官方源码地址:https://github.com/HKUST-Aerial-Robotics/VINS-Mono https://blog.youkuaiyun.com/learning_tortosie/article/details/83182258 运行这条: roslaunch benchmark_publisher publish.launc...

追 1万+

java swing form_Java6学习笔记21——利用Swing创建表单 | 学步园

import javax.swing.JFrame;import javax.swing.JTable;import javax.swing.JScrollPane;import java.awt.Container;import java.awt.Insets;import java.awt.Dimension;import java.awt.event.WindowEvent;import j...

weixin_36263738的博客 764

MIPI CPHY学习笔记02:TX物理层一致性测试项解析(HS信令模式)第一部分

在手机、平板等移动设备中,MIPI C-PHY是连接相机、显示屏等高速外设的“数据高速公路”。高速(HS)信令模式就是这条公路的“快车道”,专门用于传输高清图像、视频等大容量数据,既要保证传输速率,又要维持信号稳定。物理层一致性测试是对这条“快车道”的全面质检,确保高速传输下数据不卡顿、不失真。今天我们聚焦MIPI C-PHY TX(发射端)的Group 2 HS信令测试,用通俗语言拆解22个核心测试项(含2个过时项),看懂高速信号的合格标准。

一只豌豆象的博客 290

新系统申请软件著作权详细操作说明

今年八月底版权中心系统升级,新系统相对好用一些,至少不用再拿IE访问了,但是多了一项实名认证。下面介绍新系统的操作流程。 目录注册、登录和实名认证注册登录实名认证软件登记申请申请表填写鉴别材料身份证明文件权利归属证明文件其他材料提交材料变更登记 注册、登录和实名认证 首先访问版权中心系统:https://register.ccopyright.com.cn/login.html,如果老系统有账号直接登录即可,没有的话需要注册。 注册 点击注册按钮进入注册。 根据实际情况选择个人或单位,每个个人或单位只能在

Programming Talk 1万+

Swing程序最佳架构设计—以业务对象为中心的MVC模式(转)

Swing程序最佳架构设计之一 业务模型中心架构模式 以业务模型为中心 以业务模型为中心的架构模式。这是Swing和其他所有程序应该采用的架构模式。之所以强调Swing,是因为在Swing程序中使用这种“以业务模型为中心”的架构模式,更有意义,作用更大! 我们知道,一个软件由几个部分组成: 表现层(用户界面层) 这时软件和用户交互的部分,可以分为字符界面...

qq_36985520的博客 353

使用MATLAB求解二维顶盖驱动流问题的详细代码和说明

本文介绍了使用MATLAB求解二维顶盖驱动流问题的涡量-流函数方法。代码采用129×129网格,雷诺数Re=1000,通过迭代求解Navier-Stokes方程,包含流函数方程和涡量输运方程的离散求解。程序实现了边界条件处理、收敛性检查,并提供丰富后处理功能:流线图、涡量分布图、中心线速度曲线、矢量图和三维涡量可视化。计算结果可与Ghia等(1982)的经典数据进行验证。该代码完整展示了CFD问题的数值求解流程,包括参数设置、主循环计算和多种结果呈现方式,适用于流体力学教学和科研验证。

AI的内部世界的博客 226

在Swing中使用高级的MVC和POJOs

在Swing中使用高级的MVC和POJOs -介绍TikeSwing框架 作者:Tomi Tuomainen 2005年6月20日 翻译:waitu版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明英文原文地址:http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-tikeswing.html中文地址:ht...

weixin_33672109的博客 176

Arcgis栅格裁剪批处理工具

Arcgis栅格裁剪批处理工具

yilvyangguang520的博客 2173

Unity 面试篇|(四)Unity性能优化篇 【全面总结 | 持续更新】

Unity中,CPU准备好需要绘制的元素,对底层图形程序接口进行调用的过程,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。降低DrawCall的方法:动态合批静态合批降低shader的等级特性场景优化策略——遮挡技术。rectMask2D替代Mask。

游戏开发小Y的博客 13万+

Java Swing教务管理系统开发指南:从MVC架构到数据库连接池实践

Java桌面应用开发是掌握企业级软件开发的重要基础,其核心在于理解如何将业务逻辑、数据与用户界面进行有效分离。MVC(模型-视图-控制器)架构模式是实现这一目标的关键,它通过明确的分层职责,提升了代码的可维护性和可扩展性。在数据持久化层面,JDBC作为Java连接数据库的标准接口,是必须掌握的技术。然而,直接使用JDBC的DriverManager在频繁操作时存在性能瓶颈,因此引入数据库连接池(如HikariCP)成为提升应用性能与专业性的必要实践。连接池通过复用预先建立的数据库连接,显著减少了创建和销毁连

weixin_30074763的博客 318

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TikeSwing框架入门

在Swing中使用高层的MVC和POJOsTikeSwing框架入门摘要:TikeSwing 是一个开放源码的Swing框架,它提供了一个高度MVC(模型-视图-控制器)模式的体系结构并且使SWING组件的使用非常简单。它通过将视图组件和JavaBeans直接连接来支持POJO编程模式。在这篇文章中将阐述TikeSwing的特点,并且将示范怎样使用这个框架创建一个清晰的MVC的系结构。By

syl_100的专栏 1263

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java多线程学习之10 Thread在java Swing技术中的使用

预言: java的swing技术下的各种gui组件对象都不是线程安全的即如果存在多个线程并发访问同一个swing技术下的gui组件对象,可能会遭到程序运行异常,gui界面挂起等其他以外的错误结果!(换句话说:swing技术下同一个gui组件对象不支持多线程对它的并发访问!)(切记切记这是使用原则!),要正确设计有关使用swing技术的gui交互程序!一个重要且必须遵守的原则技巧是:"利用一个特定独立的thread(线程)来独自的访问Swing的各种组件对象!"(必须使用一个特例独行的线程来独自负责对Swi.

zy103118的博客 420

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: Spring MVC 实践
下一篇: swing之mvc模式
混魔MJM
博客等级 码龄9年 57粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值