xml地图|网站地图|网站标签 [设为首页] [加入收藏]

简析组件AWT和Swing各有的优缺点及区别,Swing程序

WebRenderer是一个一个构建在Mozilla技术上的纯Swing嵌入式浏览器组件。该组件支持Flash、CSS和DHTML等特性,现在已经发布了4.2版。主要有以下特点: ☆ 100% pure Swing Lightweight rendering ☆ W3C DOM (inc Level 2) ☆ Plugins inc Java Applets ☆ SSL Certificate Interface ☆ Windows, Linux, OSX (inc Intel), Solaris and AIX support

2,一个或者一组业务对象是Model。它们存放了Swing组件要显示的数据。它们是业务对象,因此,可以直接在业务层代码中使用,执行复杂的业务计算。

AWT是Sun不推荐使用的工具集。然而它在许多非桌面环境如移动或嵌入式设备中有着自己的优势:

实现类,这些实现类用作Swing组件的默认边框

可以看到,这里,通过将业务对象和Form对象(Swing组件的Model)关联起来,我们在Swing应用程序中只需要“以业务对象为中心”。操纵业务对象,执行业务操作即可。

Swing是三者中最强大的GUI工具集,同时它也是SUN推荐使用的GUI工具集,通过几个本版的修改和扩展后,现在的swing在某些领域有着明显优势:

TreeModel

以业务模型为中心

3.无扩展性:AWT的组件是本地组件。JVM中的AWT类实例实际只是包含本地组件的引用。唯一的扩展点是AWT的Canvas组件,可以从零开始创建自定义组件。然而无法继承和重用一个已有的AWT组件

参数基本一致。

 

3.好的组件API模型支持:Swing遵循MVC模式,这是一种非常成功的设计模式。它的API成熟并设计良好。经过多年的演化,Swing组件APIs变得越来越强大,灵活和可扩展。它的API设计被认为是最成功的GUI API之一。较之SWT和AWT更面向对象,也更灵活而可扩展。

getInputMap()方法:返回一个InputMap对象,该对象用于将KeyStroke

 

5.成熟稳定:由于它是纯Java实现的,不会有SWT的兼容性问题。Swing在每个平台上都有相同的性能,不会有明显的性能差异。

JTabbedPane 多标签页

1,表现层----Swing组件组成的GUI

3.更好的响应:由于本地组件由操作系统渲染。

Border不仅提供了上面提到的一些Border实现类,还提供了

我们知道,Swing是MVC模式的典范。Swing的各个可视化组件都使用MVC模式来设计。

然而事物具有两面性,AWT也有着许多缺点:

2、所有的Swing组件都提供了简单的键盘驱动

 

AWT组件与Swing组件有什么区别?

Swing 提供了一个BorderFactory静态工厂类,该类提供了大量静态工厂

而把直接修改Swing组件UI的方法,放到public void finished() {…}方法中执行。这样,Swing程序的交互性、响应能力和性能将大大提高!

1.更少的内存:对运行在有限环境中的GUI程序的开发,是合适的。

JTree

 

Swing

getActionMap()方法:返回一个ActionMap对象,将该对象用于指定名

为了实现这样的功能,我也使用了事件机制,实现了这一功能。这将在下文中论述。

4.标准的GUI库:Swing和AWT一样是JRE中的标准库。因此,你不用单独地将它们随你的应用程序一起分发。它们是平台无关的,不用担心平台兼容性。

1、所有Swing组件默认启用双缓冲绘图技术;

每一个Swing组件上的控制器,都不仅仅是该Swing组件的控制器,而是整个Swing程序的控制器。因为,内部类可以操纵整个Swing程序的所有资源,因此,我们可以在控制器中,使用所有Swing组件的form,也可以使用所有业务对象,调用所有业务方法,实现任何需要的功能!

AWT是Abstract Window Toolkit(抽象窗口工具包)的缩写,是SUN专门针对Java GUI编程提供的最早的也是最初的开发工具包,用来建立和设置Java图形用户界面,这个工具包提供了一套与本地图形界面交互的接口。AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系(peers)。也就是说,当我们利用 AWT 来构件图形用户界面的时候,实际上是在利用操作系统所提供的图形库。不过由于不同操作系统的图形库所提供的功能是不完全一样,所以在一个平台上存在的功能在另外一个平台上则可能不存在。这就导致一些应用程序在测试时界面非常美观,而一旦移植到其他的操作系统平台上后就可能变得“惨不忍睹”。为了实现Java语言"一次编译,到处运行",AWT 不得不通过牺牲功能来实现其平台无关性,其所提供的图形功能被定格为各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其功能的,所以通常把AWT组件称为重量级组件。

Swing组件添加边框可按如下步骤进行

有些软件不把数据保存进数据库,而是保存为文件。如,二进制文件,文本文件,XML文件等。

2.丰富的组件特性:Swing不仅包含了所有平台上的特性,它还支持根据程序所运行的平台来添加额外特性。Swing组件特性遵循特定原则,易于扩展,因此能够提供较SWT和AWT更多的功能。

TableModel

这时软件和用户交互的部分,可以分为字符界面(DOS等命令行),GUI图形界面(桌面GUI,浏览器GUI,三维界面)等。

2.更少的启动事件:由于AWT组件是本地由操作系统实现的。绝大多数的二进制代码已经在如系统启动的时候被预装载了,这降低了它的启动事件。

BoundedRangeModel保存其状态数据的Model对象

这里,我们使用ChangeListener改变监听器。

2.缺乏丰富的组件特征:按钮不支持图片。

JList 简单列表框

呵呵,希望有机会能够用Java3D编写软件,那种感觉一定更棒!

4.成熟稳定的:能够正常工作并很少使你的程序崩溃。

Swing的绝大部分组件都采用了MVC的设计模式,其中JList和JComboBox

如,在Java的企业级软件开发中,大家都知道J2EE软件分为3层:

1.丰富的组件类型:Swing提供了非常广泛的标准组件。这些组件和SWT一样丰富。基于它良好的可扩展性,除了标准组件,Swing还提供了大量的第三方组件。许多商业或开源的Swing组件库在开发多年后都已经可以方便地获取了。

name:该参数指定该工具条的名称;

但是,考虑到ChangeListener使用场合甚广,为了避免Swing组件的其他操作激发该事件,我参照ChangeListener接口,新建了一个类型的新接口:ControllerChangeListener接口。

AWT

创建JToolBar对象时可以指定如下两个参数:

 

1.更少组件类型:表和树这些重要的组件缺失了。它们是桌面应用程序中普遍使用的。

Swing中的特殊容器:

3,Swing组件的控制器被触发。

Swing 是在AWT的基础上构建的一套新的图形界面系统,是JFC(Java Foundation Class)的一部分,是试图解决AWT缺点的一个尝试。它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。所有的swing组件实际上也是AWT的一部分。Swing 对基于对等体的组件使用的术语是重量级,对于模拟的组件使用的术语是轻量级。实际上,Swing 可以支持在一个 GUI 中混合使用重量级组件和轻量级组件,不过一般将其称之为轻量级组件。

JSplitPane分割面板

2,业务层-----业务对象和Service助手类

Swing是AWT的扩展,它提供了许多新的图形界面组件。Swing组件以“J”开头,除了拥有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本组件外,还增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。在javax.swing包中,定义了两种类型的组件:顶层容器(Jframe、Japplet、JDialog和JWindow)和轻量级组件。

SpinnerModel 控制该组件内部的状态数据

 

当然,swing也有着许多不足之处:比如swing比AWT和SWT更多的内存消耗。Swing自己实现了所有组件。因此,它在运行时装载了大量的类。而在运行时Java在堆上创建小的对象导致了额外的堆空间消耗。而许多小的对象难以有效地被垃圾回收机制回收。因此,Swing应用程序通常会因无法及时回收冗余的对象而导致性能下降。

对象(键盘或其他类似输入设备的一次输入事件)和名字关联;

好了,本文并不想讨论这些“形而上学”的问题。上面的讨论,不过是想让你明白,本文所论述的“以业务模型为中心”的架构模式,并不是Swing应用程序所特有的,而是所有软件的特性,只是,在Swing这个条件优越的桌面开发环境中,更加有用罢了!

6.可扩展和灵活性。Swing完全由Java代码实现。Swing基于MVC的结构使得它可以发挥Java作为一门面向对象语言的优势。它提供了许总体上良好的性能。

TableColumnModel 保存该表格所有数据列的状态数据

 

都只负责组件的外观显示,而组件底层的状态数据维护则由对应的Model负

如,最简单的文本框JTextField的Model,是javax.swing.text.Document类型的对象。这个对象,我们也可以直接得到或设置String的值来作为Model。实际上这个String类型的数据,是Document的属性。

双缓冲绘图技术:

因此,Swing程序更能发挥我们软件开发者的智慧和能力!

JTextPane

 

ListModel

现在,Swing组件上的数据就能够和我们的业务对象的数据保持同步了!Form和业务对象虽然类型不同,却好像是同一个对象,有着同样的数据!

能改进频繁重绘GUI组件的显示效果。

以业务模型为中心的架构模式。这是Swing和其他所有程序应该采用的架构模式。之所以强调Swing,是因为在Swing程序中使用这种“以业务模型为中心”的架构模式,更有意义,作用更大!

JTable 表格

Swing程序常常是单机的,即使是网络化的,也可以在业务层中实现分布式,而不像JavaEE程序,用户界面和响应用户操作的代码都是分布在不同的机器上的!

Swing组件的双缓冲和键盘驱动

2,业务层------业务对象,及其相互之间的关系

使用JToorBar创建工具条:

有些软件需要把操作保存进数据库,永久保留下来。通常,企业级等需要业务数据的软件需要这个模块。

ProgressMonitor 进度条对话框

它实现业务对象和文件之间的映射。可能是序列化业务对象。如果是保存为xml文件,我们称它为O-XML映射,是业务对象和XML文件之间的映射。

责。

控制器,是业务功能的入口点,它连接了Swing程序的表现层和业务层,连接了Swing的Form(Swing组件的Model)和业务对象。

JComponent类提供了两个方法:

1,表现层

2、调用Swing组件的setBorder(Border b)方法为该组件设置边框

1)可能会激发ControllerChangeListener的事件,引起业务对象自动使用Swing组件的Model数据进行更新。

JFormattedTextField

 

JComboBox

Service助手类和DAO助手类,实际上都是业务对象的一部分,完全可以被放在业务类中。

简单的键盘驱动:

Swing组件和业务对象之间的互动关系

方法用于返回Border实例,这些静态方法的参数与各Border实现类的构造器

 

TreeSelectionModel 保存JTree选中状态

 

1、使用BorderFactory或者XxxBorder创建XxxBorder实例

一个Swing应用程序的GUI由很多个Swing组件组成。各个Swing组件本身是由MVC模式设计的,而我们的整个Swing应用程序的表现层也应该由MVC模式设计。

ComboBoxModel

2,Swing组件上注册事件监听器。这是Swing组件的控制器,也可以作为整个Swing程序的控制器之一。

Swing简化拖放功能

可以看到,“以业务模型为中心”,并不是一种特例,而是最基本的软件开发规律!是所有软件共有的基本特性。只是,今天,在各自不同的领域,这个基本常识被一些常用的领域中的架构模式所模糊了。

Swing组件还有两个功能:

    Swing组件的监听器,一般是使用Swing程序的内部类来实现的。因此,我们可以在控制器中完全使用整个Swing程序的所有资源!因此,Swing组件的控制器是足够足够强大的!

字和Action(Action接口是ActionListener接口的子接口)关联

1,Swing的Model,这是MVC中的M—模型部分。它保存了Swing组件所需要的数据。Swing组件的UI需要根据它来展现。

orientation:该参数指定工具条的方向;

3,Model模型,就是用户html页面表单中提交的数据。这在Struts中被称为“form”表单。

DefaultTreeCellRenderer 改变节点外观

Swing应用程序中使用MVC模式

JOptionPane简单对话框

 

为组件色设置边框

Swing程序的组成

知识点:

    在Swing组件的监听器中,我们可以响应用户的操作,作为整个程序功能的入口。在这里,我们可以调用业务层的代码进行业务计算。计算完毕之后,可以修改Swing程序的外观。常常是修改某个Swing组件的Model。

TableModel

    这同样会激发业务对象的ChangeListener事件,让Swing组件的Model得到更新,从而改变Swing组件显示的界面。

JProgressBar 创建进度条

使用MVC模式,能够更好地分离代码和数据。使整个应用的表现层部分,更加低耦合、高内聚,灵活度更高。

BoundedRangeModel进度对话框

3)我们可能会针对业务对象,执行业务层代码,进行复杂的业务计算。得到新的业务对象的值。

JSpinner 创建微调控制器外观

软件的核心和难点就在这里!巨大的开发工作量和思考,也都集中在这里。

参考文献:《Java疯狂讲义》(第三版)

3,数据库访问层-----DAO助手类

JSlider 创建滑动条

 

如果要关闭双缓冲,可以调用setDoubleBuffered(false)方法

 

JLayer 装饰组件

Swing程序的MVC模式的使用

JFileChooser和Java7增强的JColorChooser(颜色选择器对话框)

好了,我也应该为java和Swing在桌面的成功尽我绵薄之力,共享我的思想吧!以感谢这么多年来,Java带给我的美好回忆。

MetalBorders.oolBarBorder、MetalBorders、TextFieldBorder等Border

 

知识点:

Swing程序中的表单数据Form。是由Swing程序的各个Swing组件的Model组成的。其各个部分的数据类型非常不同。

 

我们知道,一个软件由几个部分组成:

Java和Swing都是杰作。我这个人对别人一向很挑剔的,能够得到我由衷地赞誉,可想而知它们有多优秀了。奇怪的是,它们居然一直都无法占领桌面市场。有人说这是技术的原因。我认为这应该是商业、历史的原因才对。

在上文中,我们提出了Swing组件和业务对象之间相互的事件监听机制。Swing组件监听业务对象,使用“观察者模式”的一种实现机制,ChangeListener改变监听器。当然,也可以使用Observe/Observable这样的机制,或者其它的事件机制。但是,经过权衡,我觉得还是ChangeListener最符合我的需要。它功能强大,又很简单。

                       MVC模式

 

我打算写一系列关于Swing程序开发的文章。这是由于最近我在做一个Swing产品的开发。长期做JavaEE程序,让我有些麻木了。Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的产品!

 

3,Swing组件类。这是“门面”,它封装了Swing的UI对象和Model对象。我们一般都是通过它来操纵Swing组件,不会直接使用Swing组件内部的UI对象和Model对象。

前言:

现在,业务对象和Swing组件之间,通过双向的事件监听机制,实现了双向的引用!

为了让业务对象能够得到用户最新输入的数据,我们还需要将业务对象注册到Swing组件上。一旦Swing组件的数据发生了改变,就通知业务对象。业务对象根据Swing组件的Model,也就是Form对象的数据,修改业务对象的值。

2,Controller控制器,就是响应用户操作的Action。

此Model非彼Model

2,用户在界面上进行操作。

现在有一些开源软件实现了Java对象和XML文件之间的映射,就如同是O-R映射一样。其实,基于Java的XML访问组件,自己开发O-XML映射也是非常简单的,我自己也写了一个这样的库。

因此,Swing程序中的表单数据Form的类型是非常多的。显然,我们的业务对象不大可能和Swing的Form数据的类型一致。

在我的《Swing多线程编程》一文中,我论述过Swing程序中,应该将SwingUI处理代码和一般的业务代码分配在不同的线程中。

1,用户可以看到一个Swing组件构成的GUI界面。

我钟爱ChangeListener,还是在Swing组件上注册一个ChangeListener监听器,这个监听器就是我们的业务对象。

业务模型,及其互相之间的交互,这才是软件的核心!

现在,我们的Swing程序结构清晰,功能区分合理,低耦合、高内聚,堪称是MVC模式的典范!

还有,如JTree组件的Model是TreeModel对象。

有机会作Swing软件的开发,让我非常有感觉!

Swing程序的用户界面,就会自动更新。

4)最后,当然,我们也可以直接修改某些Swing组件的Model或者外观。因为,作为内部类的控制器可以使用Swing程序所有的属性和方法。

2,业务层

HTML表单的数据,都是String型的,而我们的业务对象的属性,却未必都是String型的。因此,在Struts应用程序中,我们需要根据接收到的form对象,构造业务对象。

 

 

因此,Form对象类型和业务对象类型一致,这是少之又少的特例。

4,持久化层(可能有)

当我们需要某个Swing组件监听我们的业务对象时,我们创建一个该Swing组件的子类,它实现ChangeListener接口,实现

2,Swing的UI类。这是MVC模式的View—视图部分。它根据组件的Model中的数据,执行绘制、展现Swing组件的任务。

1,Swing组件的Model。Swing组件的MVC模式设计,使整个Swing组件是以Model为核心的。通过更改Model,我们就能够即时改变Swing组件的UI外观。

业务对象又该怎样监听Swing组件呢?

Swing程序中的表单数据(Form)和业务对象(Model)

3,在Swing各个组件上注册响应事件的监听器(控制器),以响应用户的操作。这些控制器,使用匿名内部类实现。

在Swing组件上还可以注册一系列的事件监听器。它们就是MVC模式中的Controller控制器。

 

1,View视图,就是使用Struts标签的JSP页面。

 

因此,Swing程序的表现层的数据Form和业务对象Model之间的转换,必然要由我们自己去实现。不大可能直接把Form作为业务对象扔到业务层中使用。也不可能直接在Swing的GUI中显示业务对象的数据!

 

Swing程序中的应用

Swing组件之间,还有着复杂的关系。Swing的UI类,监听Model对象的数据改变,即时进行重绘界面的工作。

这仅仅是软件的外表,外貌再华丽,也不能说明软件的优劣!Google的界面平淡无奇,但它确是今天最强大的软件!

在Swing应用程序的编写过程中,我们需要使用Swing组件的2个部分:

1,表现层(用户界面层)

这是实现软件功能的地方。存在着大量映射着业务领域的对象,存在着复杂的业务计算。这才是软件真正工作的地方。

整个Swing程序应该这样使用MVC模式:

 

2)业务对象更新数据,又会激发业务对象上的ChangeListener的事件。这会引起所有监听业务对象其Swing组件更新其Model的数据,从而改变Swing组件的显示。

3,数据库访问层(可能有)

在SpringMVC中,提供了一个机制,可以帮助我们自动把表单数据转为业务对象。对于一些特殊的类型转换,还是需要我们手工提供转换。

 

它们不能直接在Swing组件中显示。而是需要根据业务对象,构造Form对象,也就是Swing组件的Model来展示数据。

 

Form是表现层的数据容器,而业务对象则是来自于特定业务的对象。Form的数据类型,变化不多,而业务对象的数据类型,那就是千变万化了。

Swing程序最佳架构设计之二

                       业务模型中心架构模式

台灯、电脑、Java,还有Coffee,伴我度过多少不眠之夜!I love U!

MVC模式在Swing程序中的应用

Swing程序作为桌面程序,拥有比JavaEE程序更好的环境,更强的功能。

public void stateChanged(ChangeEvent e){…}方法,根据监听的业务对象的数据,构建自己新的Model,从而改变本Swing组件的显示。

 

这就是采用“以业务对象为中心的MVC模式”的巨大优势!

读者应该对JavaEE比较熟悉吧。毕竟,今天Java的主战场是在企业级应用上,会java,而不懂javaEE,这就有点说不过去了。

采用MVC模式后的Swing程序的执行流程

Swing组件一般由三个部分组成:

Web应用程序中的表单数据form,是来自于Html的表单的各个项的数据,都是String类型。

所以,在这里的控制器中,我们应该使用SwingWorker这个助手类,把业务代码放在public Object construct() {…}方法中执行,

助手类和业务对象分离,不过是一种设计模式而已。

这里,我以大家比较熟悉的JavaEE的表现层技术来说明Swing程序的MVC设计。

它实现业务对象和关系型数据库的映射。称为“O-R”映射。

Swing程序最佳架构设计之一

 

Form和业务对象之间的自动转换,固然是提高了开发效率。但是,我们必须要明白,GUI组件中的数据Form和业务对象是截然不同的两种东西。2者碰巧一样,或者可以自动转换,只是特例。它们本质上还是两样截然不同的东西。

3,持久化层-----把业务对象保存为文件,或者是数据库记录。

这样的架构模式,模糊了“业务对象”是整个软件的核心这样一个事实。

一般,Swing程序由以下几部分组成:

为了让View—Swing组件实时展现业务对象的数据,我们需要让Swing组件监听业务对象,一旦业务对象发生改变,就重新根据新的数据,构建新的Swing组件的Model,从而在Swing组件上展现最新的业务对象数据。

 

Struts中,其MVC由以下几部分组成:

1,JFrame或者其他顶层容器中,由各个Swing组件构成了View视图层。用来展现数据,提供用户操作的图形界面。

 

本文由必威发布于Web前端,转载请注明出处:简析组件AWT和Swing各有的优缺点及区别,Swing程序