王朝网络
分享
 
 
 

在Swing中使用高级的MVC和POJOs

王朝vc·作者佚名  2008-05-31
宽屏版  字体: |||超大  

摘要:

TikeSwing 是一个开放源码的Swing框架,它提供了一个高度MVC(模型-视图-控制器)模式的体系结构并且使SWING组件的使用非常简单。它通过将视图组件和javaBeans直接连接来支持POJO编程模式。在这篇文章中将阐述TikeSwing的特点,并且将示范怎样使用这个框架创建一个清楚的MVC的系结构。(2,400个英文单词;2005年6月20日)

最近,在Java社区里面,丰富的互联网应用程序(RIAs)的兴起成为一个热点话题。另外一些新的技术,像Ajax(异步的javascript和xml),MacroMedia Flex, 和Laszlo,以及与Java Web Start一起使用的虽旧而好的Swing,它们都被提议作为RIA技术。

然而,Java社区里面的很多人对Java基础类库(JFC)和Swing提出了批评。Swing在建立高度MVC模式的客户端体系方面不能提供太多的帮助。任何合理的服务器应用程序返回传递的对象,或者称为简单初始Java对象(POJOs),把它传递到客户端的技术证实了J2EE世界的窘境。从POJO范围映射到Swing组件需要太多的手动的代码,反之亦然。

同样的,实现Swing其他的功能,就像线程句柄和验证域,也是很费力的事情。而且有时候Swing组件很难使用:创建一个合适的表格或者树模型通常需要很多的编码,而且需要深入的研究Swing编程文档中的API。

TikeSwing 是一个开放源码的Swing框架,它提供了一个高度MVC(模型-视图-控制器)模式的体系结构并且实现了模型,组件和控制器通信的自动化。它简化了Swing组件的使用,并通过将视图组件和JavaBeans直接连接来支持POJO编程模式。

这篇文章将示范怎样使用TikeSwing创建一个清楚的MVC的体系结构。也将阐述建立TikeSwing组件的原则,并简单描述在这个框架中包含的最佳体验和机制。

MVC体系结构

众所周知,MVC范例是推荐的图形用户界面发展的基本体系。它还有很多的可用的变种,就像MVC++, HMVC (Hierarchical MVC), MVC Model 2, MVC Push, and MVC Pull,它们每一个都有些不同之处。TikeSwing基于下面的MVC原则:

●Model 模型:

o来自一些真实世界或者系统的抽象

o包装其数据和函数

o在数据改变时通知观察者 (编者注:observer, 设计模式术语)

●View 视图:

o系统的用户界面

o依附于模型并通过显示界面将它的内容显示出来

o在模型改变时自动刷新受到影响的部分

●Controller 控制器:

o控制应用程序的流程

o接受用户的输入,并根据用户输入指导模型和视图完成任务

下面的图表表示了TikeSwing中MVC的类结构。

图 1. 一个使用TikeSwing的应用的MVC类图

类MyModel, MyView, 和MyController由一个使用框架的应用来实现。MyModel和MyController扩展了TikeSwing的YModel 和YController类。一个视图的类可以是任何实现了YIComponent接口的java.awt.Component。

TikeSwing在装配类结构的时候不使用任何的配置文件。当YController,YModel和视图组件提供了要求的功能特性的时候,扩展适当的类已经足够了。下面讲述如何使用TikeSwing来实现模型、视图和控制器类。

模型

TikeSwing的模型是一个为实现视图而包含数据的JavaBeans组件。一个模型类可能包含嵌套的JavaBeans,数组,映射和集合。和标准JavaBeans中要求的一样,所有模型的类变量必须有适当的GET和SET方法。从这种意义上说,TikeSwing就像很多的网络应用程序框架那样工作,所以在不同的技术之间重用模型类是很轻易的。

YModel是模型的基类。它提供了报告数据改变的方法。当触发了一个事件的时候,框架会更新与之相连的视图。在分布式环境中,一个模型类有从服务器应用程序中得到POJOs的方法(通常是从隐藏了业务服务的实现细节的业务代理中)。模型自身存储了POJOs,且它有责任通知观察者。在有些MVC的体系结构中,一个控制器类和服务器通信,POJOs存储在控制器中。然而,TikeSwing分离出YModel类的方法有下面的优势:控制器专著于流程,另外的方法(操作模型数据的)可以被加在客户端。YModel遵循了传统的MVC模式,所以MVC中类的责任就清楚地分开了。

下面的代码演示了模型类如何通过给定的参数找到customers。模型的类变量name和id是搜索标准,customers是包含搜索结果的Customer POJOs的集合。findCustomers()方法通过customerServiceDelegate从服务器应用程序中得到customers。当方法notifyObservers()激活时,框架会自动更新相连的视图。

public class FindCustomerModel extends YModel {

PRivate String name; private String id;

private Collection customers;

private CustomerServiceDelegate delegate = new CustomerServiceDelegate();

public void findCustomers() {

setCustomers(delegate.findCustomers(id, name));

notifyObservers("customers");

}public void setCustomers(Collection customers) {

this.customers = customers;

}

public Collection getCustomers() {

return customers;

}

public void setId(String id) {

this.id = id;

}public String getId() {

return id;

}public void setName(String name) {

this.name = name;

}

public String getName() {

return name;

}}

视图

TikeSwing视图是包含其他Swing组件的Swing组件。通常,一个视图类是一个面板,一个对话框,或者一个帧,它们建立了子组件并将之添加到自身(就像在通常的Swing开发环境中一样)。然而,TikeSwing应用程序中使用的所有组件都必须实现适当的接口以连接框架的MVC体系结构。幸运的是,框架包含一个很大的为了这种目的已经实现的组件的集合。

一个非凡的名字必须赋予一个视图组件,这样框架就能在组件和被命名的模型类变量之间复制数据。命名的惯例和其他的用于网络应用程序框架的和Apache BeanUtils库(它通常用于框架的执行)类似。下面是支持的命名格式:

●简单的: 直接连接到模型域的组件;例如,field1

●嵌套的:连接到模型内部的JavaBeans域的组件;例如,field1.field2

●索引的:连接到模型内的数组域的组件;例如myArray[1]

●映射的:连接到模型内的映射域组件;例如,myHashMap(“foo”)

●组合的:通过结合符号连接到模型的内部域的组件;例如,field.myArray[1].myHashMap["foo"]

除了模型类的GET和SET方法外,视图类必须为每一个视图组件建立一个GET方法。

下面的例子是为FindCustomerModel建立的视图类。它使用了扩展了基础Swing类的TikeSwing组件(从JLabel到YLabel,JTextField到YTextField,等)。例子的代码和标准的Swing视图很像,只有setMVCNames()方法包含了TikeSwing特有的代码。依照上面讲述的原则,它设定了模型组件的连接。resultTable列通过YColumn对象与customers集合中的POJO域相连。findButton不显示任何从模型得到的数据,但是MVC的名字是为TikeSwing的事件句柄设定的(以后再讲)。

public class FindCustomerView extends YPanel {

private YLabel idLabel = new YLabel("Id");

private YLabel nameLabel = newYLabel ("Name");

private YTextField idField = new YTextField();

private YTextField nameField = new YTextField();

private YPanel criteriaPanel = new YPanel();

private YTable resultTable = new YTable();

private YButton findButton = new YButton("Find");

public FindCustomerView () {

addComponents();

setMVCNames();

}

private void setMVCNames() {

idField.getYProperty().put(YIComponent.MVC_NAME,"id");

nameField.getYProperty().put(YIComponent.MVC_NAME,"name");

resultTable.getYProperty().put(YIComponent.MVC_NAME,"customers");

findButton.getYProperty().put(YIComponent.MVC_NAME,"findButton");

YColumn[] columns = {new YColumn("id"),

new YColumn("name")};

resultTable.setColumns(columns);

}private void addComponents() {

this.setLayout(new BorderLayout());

this.add(criteriaPanel, BorderLayout.NORTH);

idField.setPreferredSize(new Dimension(100, 19));

nameField.setPreferredSize(new Dimension(100, 19));

criteriaPanel.add(idLabel);

criteriaPanel.add(idField);

criteriaPanel.add(nameLabel);

criteriaPanel.add(nameField);

criteriaPanel.add(findButton);

this.add(resultTable, BorderLayout.CENTER);

}

public YTextField getIdField() {

return idField;}

public YLabel getIdLabel() {

return idLabel;

}

public YTextField getNameField() {

return nameField;

}

public YLabel getNameLabel() {

return nameLabel;

}

public YTable getResultTabl

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有