admin 管理员组

文章数量: 1086019


2024年3月12日发(作者:strcat函数能传递几个参数)

2010年第1期 

文章编号:1006—2475(2010)01-0185-03 

计算机与现代化 

JISUANJI YU XIANDAJHUA 第173期 

Java2 Swing组件扩充的研究与实现 

王乐,周琪云,肖小方,晋海峰 

(江西师范大学计算机信息工程学院,江西南昌330022) 

摘要:Java2 Swing标准组件可以满足一般桌面程序的需求,但在实际的项目中会碰到一些特殊需求的组件,这些特殊组 

件往往是标准组件的组合或者功能的改写。本文首先对Swing组件的体系结构进行阐述,然后逐一分析Swing组件的组 

成对象,最后给出对Swing组件进行扩展的步骤,以及时JMenuBar组件进行扩充实现多级下拉菜单的关键代码。 

关键词:Java2 Swing组件;多级下拉菜单 

中图分类号:TP31I.52 文献标识码:A doi:10.3969/j.issn.1006-2475.2010.O1.052 

Research and Implementation of Java2 Swing Component Expansion 

WANG Le,ZHOU Qi—yun,XIAO Xiao—fang,JIN Hai—feng 

(CoUege of Computer&Information Engineering,Jiangxi Normal University,Nanchang 330022,China) 

Abstract:Java2 Swing standard components to meet the gener ̄needs of the desktop program,but the actual projeets will encoun— 

ter needs of some special components,these special components are often a combination of standard components or features of the 

rewrite.First,this article describes the architecture of Swing components,then analyzes each of the Swing components of the 

composition of the object,gives the standard components of the expansion of the steps and multi—stage pull・down menu to realize 

the key to the code at last. 

Key words:Java2 Swing component;pull—down menu 

0 引 吉iZ=l 

Java语言过去一直被认为是开发Web项目的佼 

系架构的原理。 

1 Swing架构 

Swing采用了分离模型架构(separable model a卜 

chitecture),是一种变体的MVC设计模型 ¨。 

1.1 Swing体系结构 

佼者,但在桌面程序开发中很少会被程序开发者所采 

用,其原因是Swing被误认为界面不美观、速度慢两 

大缺点。之所以被误解是开发者对Swing的体系架 

构不熟悉和它的历史原因造成的。随着由Sun自主 

开发的集成开发环境(IDE)NetBeans的迅猛发展,其 

最新版本对Swing GUI可视化设计的支持已经超过 

了所有对手,进一步推动着Swing以更快速度在桌面 

应用中普及。随着Web热潮的减退,人们已更多的 

开始理性地思考B/S和C/S架构的选择,某些领域 

Swing技术已经成为首选的解决方案。Swing是高度 

灵活的,但是也因此相当复杂,虽然新手能够使用 

Swing创建基本的图形用户界面(GUI),但是真要创 

建一个复杂、专业的GUI界面,必须理解Swing的体 

收稿日期:2009-02-09 

图1 Model—View.Controller architecture 

MVC是Mode1.View—Controller的简称,即模型-视 

图.控制器。它是Xerox PARC在2O世纪80年代为 

编程语言Smalltalk一80发明的一种软件设计模式 。 

它的设计思想是把应用程序分成3个核心模块:模 

作者简介:王乐(1982.),男,江西进贤人,江西师范大学计算机信息工程学院硕士研究生,研究方向:计算机网络与数据库; 

周琪云(1964一),男,江西南昌人,教授,硕士生导师,研究方向:计算机网络与数据库;肖小方(1983-),男,江西永丰人,硕士 

研究生,研究方向:计算机网络与数据库;晋海峰(1977一),男,河北张家口人,硕士研究生,研究方向:计算机网络与数据库。 

l86 计 算机与 现代化 2010年第1期 

式、视图和控制器,分别担负不同的任务。视图是图 

形显示的部分,是与用户进行交互的界面。模型代表 

业务数据和业务逻辑。控制器用来接受用户的输入 

并调用模型和视图,去完成用户的需求.如图l所示。 

这种概念模型简单清晰,但Swing的开发小组在实际 

设计中发现:组件的Controller与View通常需要紧密 

的耦合,但是基于经典的MVC模型,Controller与 

View是两个独立的部分,并且一个组件通常会具有 

多个View。基于这种差别,Swing采用了一种变体的 

MVC模型,如图2所示,这种变体的模型和MVC架 

构设计一样把一个组件的模型(Mode1)部分当作一 

个单独的元件,负责存储数据。Component充当控制 

者角色,负责协调Model、UI Delegate和Renderer 。 

UI Delegate同时具有视图和控制者两种角色,负责从 

Model获取数据并渲染到屏幕上去。UI Delegate通 

过与UI Manager进行交互,来管理组件的外观和行 

为,使得UI Delegate对象可以在运行的时候动态替 

换,从而使Swing具备了可插拔的外观。Renderer(渲 

染器)是在一些要显示大量数据的组件如JTree、JTa. 

bel中,用来对一类相同类型组件进行配置的组件 。 

的方法; 

⑤组件事件处理接口的管理,包括添加、删除等 

操作; 

⑥Model、UI Delegate和Rcnderer的set/get 

方法。 

如JComboBox组件的Component: 

public class JComboBox extends JComponent 

implements ItemSelectable,ListDataListener,AetionListener, 

Accessible{ 

protected ComboBoxModel dataModel; 

public void setModel(ComboBoxModel aMode1){..。}//设 

置模型的方法 

public ComboBoxModel getModel(){.一}//获取模型的 

方法 

public void setUI(ComboBoxUI ui){..・}//设置uI代理的 

方法 

public ComboBoxUI getUI()}_・・{//获取UI代理的方法 

public void setRenderer(ListCellRenderer aRenderer) 

}_・・}//设置渲染器的方法 

public ListCellRenderer getRenderer()i.一}//获取渲染器 

的方法 

(2)Model。 

Model是存取数据的接口。Swing提供的模型可 

分为两大类:GUI状态模型和应用数据模型 J。GUI 

状态模型,是描述GUI控件可视化状态的接口,如按 

钮是否按下,或歹U表中那一项被选中;应用数据模型, 

是描述具有应用程序含义数据的接口,比如表格中的 

数据,或列表显示的选项。Model通过Component里 

的set/getModel函数进行访问修改。模型接口里需 

要提供设置、获取数据的函数,还需要提供监听Mod— 

el改变事件。 

(3)UI Delegate。 

UI Delegate对象负责代理实现组件的外观 

(Look)和事件处理(Fee1),它是由当前的LAF(Look 

and Feel,外观和感觉)提供的可以被动态地修改。拥 

有LAF特征的Swing组件在javax.swing.plaf包都会 

有一个接口或者抽象类来代表它的UI Delegate。这 

些UI代理类的命名规则是该组件类去掉前缀J,加 

上后缀UI。比如JComboBox的UI Delegate类的名字 

是ComboBoxUI,它们是LAF与Component连接的接 

口。UI Delegate在组件的构造函数中创建,并以组件 

的限定JavaBean属性的形式访问,如setUI()、getUI 

()。在每个IAF里都会提供每个组件UI Deleagte的 

实现类,如Metal LAF包给出了JComboBox组件uI 

代理ComboBoxUI的实现类MetalComboBoxuI。 

2010年第1期 王乐等:Java2 Swing组件扩充的研究与实现 187 

Renderer以接口,封装和复用一些复杂Swing组 

件的子组件的渲染代码。用Renderer逐一地去渲染 

复杂组件每个子组件的方法,去代替在复杂组件的 

paint方法中根据数据类型一个一个地画出每个的子 

组件,采用渲染器(renderer)机制后,降低代码重复 

率,提高组件的可扩展性。每个采用renderer机制的 

Swing组件,都定义了适合自己类型的渲染器接口。 

如JComboBox的渲染器接口ListCellRenderer J: 

public interface ListCellRenderer{ 

Component getListCellRendererComponent //返 一渲 

染组件显示列表中的某个选项。 

JList list, //参数list是正在渲染的列表 

Object value, //value是列表中当前正在渲染的项 

int index, //index是当前正在渲染的项的索引 

boolean isSelected, //isSelected是当前项足否选巾 

boolean cellHasFocus); //cellHasFocus是指当前项是 

否拥有焦点 

} 

2下拉列表框多级菜单的实现 

通过以上对Swing组件组成部分的研究,总结出 

将Swing组件进行扩充的步骤:首先,根据功能需求 

选择一个最合适的父类组件和子组件。第二,根据组 

件业务逻辑、界面的需求,对父组件和子组件的事件 

驱动、外观进行改写。下面选择JMenuBar作为父组 

件、JMenu作为子组件进行组件扩充,实现下拉多级 

菜单。关键代码如下 J: 

public class JMenuComboBox extends JMenuBar{ 

JMenu menu; //子组件声明; 

public JMenllComboBox(JMenu menu){ //构造函数,初 

始化添加菜单 

this.menu=menu; 

MenuItemListener listener=new MenuItemListener(); 

setListener(menu,listener); //对每项菜单添加监听 

add(menu); 

} 

//予菜单监听函数 

class MenuItemListener implements ActionListener 

public void actionPerformed(ActionEvent e){ 

JMenuhem item=(JMenuhem)e.getSource(); 

menu.setText(item.getText()); 

menu.requestFocus(); 

} 

} 

//设置监听函数 

private void setListener(JMenuhem item,AcfionListener lis— 

tener){ 

if(item instanceof JMenu){ 

JMenu menu=(JMenu)item; 

int n:menu.gethemCount(); 

for(int i=0;i<n;i++){ 

setListener(menu.getltem(i),listener); //用迭代的方 

法,为每一级菜单添JJl】监听 

} 

}else if(item!=nul1){ //当item是分隔条时 

为null 

item.addActionListener(1istener); 

} 

} 

3 结束语 

对Swing标准组件进行扩充,可以有效地创建出 

些符合实际需要的复杂组件。本文对Swing标准 

组件JMenuBar和JMenu进行扩充,并实现了下拉多 

级菜单,在《江西省公安局机动车治安管理综合信息 

系统》中得到了应用和验证,很好地解决了项目中下 

拉框显示多级数据的需求。 

参考文献: 

[1]裴龙,何大可.Java2 Swing组件设计模式分析[J].计算 

机应用,2001,21(8):274—275,280. 

[2]孙卫琴.精通Struts基于MVC的Java Web设计与开发 

[M].北京:电子工业出版社,2004. 

[3] 吕校春,李玲莉.基于Swing的Java GUI组件开发[J]. 

机械工程师,2008(5):129—131. 

[4] Chet Haase,Romain Guy.Filthy Rich Clients:Developing 

Animated and Graphical Effects for Desktop Java Apphca— 

tionsf M1.Prentice Hall,2007. 

[5] 包亮,陆继翔,潘金贵.JAVA新类库的uI机制的分析 

[J].小型微型计算机系统,1998,19(12):60-64. 

[6] Brace Eeke1.Thinking in Java(4th Edition)[M].Prentice 

Hail PTR,20O7. 

[7] 孙卫琴.Java面向对象编程[M].北京:电子工业出版 

社,2006. 

[8]阎宏.Java与模式[M].北京:电子工业出版社,2002. 

[9]David M Geary.Graphic Java 2 Mastering the JFC Volume 2: 

Swing(3rd Edition)[M].Prentice Hall/Pearson,20OO. 

[10]Joshua Marinacci,Chris Adamson.SWING HACKS[M]. 

Oreilly,2007. 

[11]James Elliott.Java Swing(Second Edition)[M].O’Reilly 

&Associates.2002. 

『12]Cay S Horstmann,Gary Cornel1.Core Java2,Volumel:Fun— 

damentlas,6/E[M].Sun Microsystems,2003. 


本文标签: 组件 进行 模型 接口