java对于服务器,个人电脑和移动设备来说是一项伟大的技术.由于需要java的跨平台的特性,因此java在服务器和移动设备方面的应用是非常成功的。但java在个人电脑应用方面的情况和在服务器及移动设备方面的应用有所不同,但是这很快就会有所改变,至少比你想象得要快。在这篇文章中,我会分析一下java在桌面环境中的应用将怎样得到提升,然后具体说一下java gui(用户图形接口)的三个主要的工具:awt, swing, 和swt.。在下文中,我将会开发一个完整的java桌面应用程序.
java与桌面端
现在,流行的桌面平台要数windows、mac、and linux了。但它们不是十全十美的,windows主宰着桌面操作系统的市场,其上有巨大的应用和开发群体,但它昂贵且有许多安全漏洞。linux有着稳固的基础,它是开源的软件,比windows更可靠。macs非常容易操作且不是黑客的目标,但与windows和linux比起来,mac的硬件和软件可选的余地非常的有限。公司和个人选择他们的操作系统基于许多因素。花费少且安全性高是首选的因素,这导致一些组织从windows 系统转而选择linux。对许多用户来说,可用性及对原有应用程序的支持是非常重要的因素,这意味着windows 将继续享有巨大的市场。mac有其自己忠诚的用户,这使得苹果机仍然可以存活,linux 在桌面的流行及mac的成功创造了多样性,这种多样性正是java需要的,这种多样性使得java在桌面有举足轻重的地位。
跨平台的支持
java 运行于所有相关的操作系统,包括windows、 mac和linux。对于任何组织,他想把现有的应用从一个操作系统移植到另一个操作系统而不用做太多的改动,那么java正是他们首选的桌面开发平台。或许用微软的可视化工具很容易构建.net应用,但是这将使你被绑定在了windows平台上了。 很多人也许想立刻用linux 代替windows 从而避免由微软件操作系统的漏洞带来的问题。用户不能容忍的问题之一是当从windows移植到linux带来的巨大的费用。如果你的应用程序用java构建,你就没有了这些问题,java的图形用户界面看上去会跟你用的操作系统一样,而并不需要做什么改动。 假如有一天又有一种桌面操作系统出现的话,java 是个安全的赌注,因为它现在能够运行在windows和linux 上,那么可以推测它也可以运行在将来可能出现的操作系统上,这些操作系统可能或迟或早地由微软,或是开源社区,或是其它的人开发出来。
丰富的特征
最初,java只有非常有限的一些特征去构建图形用户界面。思想就是用平台无关的java应用程序接口打包不同的操作系统的本地图形用户界面,称之为抽象的窗口工具。仅有普通的部件如文件域、文本区、选择框、单选按钮、列表框和按钮被awt支持,图形和图像的特性支持非常有限,也就是说,只足够构建简单的applet程序。 认识到需要更高级的图形用户界面组件和图形能力,sun公司开发了swing,java 2d,java 3d,图像的输入/输出,java高级图像(jai)和很多其它的。这些中的一些窗体组件现在已经是java 2标准版(j2se)里的一部分,并且其它的一些扩展必须和你的应用程序打包在一起。例如swing、java 2d、图像的输入/输出都是java的核心api,随着java开发工具包(jdk)和java运行环境一起提供。让我们不要忘了j2ee平台。如果你开发服务器端的应用程序并且需要丰富的图形用户界面,那么你毫无疑问应该选择java。这允许你把服务器端的一些代码移到客户端,反之亦然。例如:一个项目可能开始是基于web和图形界面,在某些时候,用户可能要求图形元素不能在html中实现,如果你选择java做客户端应用,那么你可以重用这些当初用来做服务器端的代码。如果你用远程调用,一些类会真正地实现服务器和客户端的共享。通过页面服务器,java桌面应用也能够和其它的java 或非java应用程序通信,如corba, tcp/ip,或是 http。
java有三个主要的图形界面工具:awt,swing和swt。swing 是构建java图形界面标准的api(应用程序接口),一些awt类由swing基础而来。swt是一个非常有前途的新的窗体工具,由ibm资助。但是事实上,这三者相互补充,他们满足不同的需求。
awt
抽象窗口工具集为简单的applet程序设计,它不适宜用来构建丰富的桌面图形界面。但是从开始被介绍,它至少有一个好的思想就是布局管理,它负责为组件找到一个放置的位置,这种机制是必需的,因为gui组件在不同的操作系统中有不同的尺寸。 现在, awt扩展了组件模型和事件处理机制(由javabeans说明定义),新的图形api(称为java 2d),支持剪贴板和拖拉操作,打印,准入,和新的gui工具swing,所有这些都归到java基础类中(jfc)。 swing swing是曾经开发的最复杂的gui之一。它有一套完全的组件从按钮到文件域到表格,树型和文件编辑器。这些组件不依赖于操作系统本地的部件,而是用原始的图形像直线、矩形、文字画出。这种画代表感观插件,它能够模仿本地的感观。 swing也有平台无关的外观称为"metal"。 swing的结构由mvc模式得到启发,这里在屏幕上的视觉gui组件和支持数据的模型对象之间有一个明显的分隔,在gui和数据层之间的通讯基于事件。在最初的swing版本中有许多错误并且有执行问题,这减慢了接受它的速度。swing最大的问题是被从事于并且许多人相信它是为开发桌面应用而准备的。今天,有许多基于swing开发的商业产品,包括大多数的java集成开发工具,我所喜欢的集成开发工具是jbuilder,它的速度相当的快。
swt
swt是ibm为它的eclipse集成开发环境而开发的图形用户界面工具。swt可以在eclipse环境外使用,而且提供对操作系统本地图形用户界面的直接访问。因此,基于swt的java应用程序拥有本地的图形用户界面并且可以和本地别的应用程序和部件集成在一起。 假如你的桌面应用程序产生html报表,你想把它显示给用户看。你可以使用swing去浏览简单的html文档,但这不是一个理想的的解决方案。最好是在你的应用程序里提供ie或者mozilla浏览器引擎。swt社区现在正在设计浏览器api,这些api可以让你产生基于ie或者mozilla的html窗口。 swt现在可以在aix, hpux, linux, qnx, solaris, and windows下面运行。mac os x is 也在进行之中
误解与bug
对于java/swing一直有着误解,诸如:java/swing太慢了,或者是java/swing需要更多的内存。swing也许在老式的奔腾的cpu而且只有32m内存运行jdk1.2运行起来却是很慢。但是如果在piii级别的cpu有着256mb的内存,运行jdk1。4环境是足够快的。对于一个应用程序来说鼠标在1毫秒和在10毫秒的反映的区别,对于使用者来说看起来是,没什么区别的。java在企业级的数百人,上千人同时在线的服务器表现的很好。java在对于有限资源的移动设备上的表现也是很出色的。那为什么java不能成为很好的桌面应用程序呢?以我的观点看,swing的bug比其运行速度慢这问题还严重。例如,如果你用的是jdk 1.2,你将不能在表格(称为jtable)中输入%&'($#!q 等这些字符。这八个字符和箭头键及home, end, pgup, and pgdn这几个键的键值是相同的。其中一个由jtable由到的类调用了keyevent.getcharcode()方法代替keyevent.getkeycode()。这个bug这jdk 1.3已经得到了纠正。你大概已经放弃过swing,如果你是从用jdk 1.2的swing,你可能因为你不能在表格里输入q而恼怒。可能不幸的是你正需要用jtable开发一个swing应用,你将花费许多时间从sun的bug数据库中查找解决的办法。但没有发现你需要的(记住在那时swing还是个新事物),你将花费更多的时间去看swing的源代码和发展中的工作区,经过了这个的经历之后,很少有人很在另一个项目里再用swing了,你的工作区会像下面这样子:
| import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class workingtable extends jtable { public static final boolean jdk12 = system.getproperty("java.version").startswith("1.2"); public void processkeyevent(keyevent e) { if (jdk12) { char ch = e.getkeychar(); if (e.getid() == keyevent.key_typed && ((33 <= ch && ch <= 40) || ch == 'q')) { int anchorrow = getselectionmodel().getanchorselectionindex(); int anchorcolumn = getcolumnmodel() .getselectionmodel().getanchorselectionindex(); if (anchorrow != -1 && anchorcolumn != -1) { if (!isediting()) editcellat(anchorrow, anchorcolumn); component editorcomp = geteditorcomponent(); if (isediting() && editorcomp instanceof jtextfield) { jtextfield textfield = (jtextfield) editorcomp; textfield.settext(textfield.gettext() + ch); return; } } } } super.processkeyevent(e); } } |
不幸的是,swing有许多像上面描述的那样的问题,一些问题很难解决,需要做大量的工作。例如,swing的打开文件和保存文件的对话框是基于称为jfilechooser的组件,它部分的执行了jdk 1.2和jdk 1.3(一些特性总是不能用的,要创建一个新的目录对大多数用户来是一个挑战)。我不知道为什么sun需要几年的时间直到jdk1.4中才完成jfilechooser。在jdk 1.4之前,你有两种选择:用这种破烂的jfilechooser或是创建你自己的文件选择框,borland公司在他们的jbuilder 4中做一个很好的文件打开对话框。然而,大多数的开发者用的是标准的jfilechooser,给他们的用户带来许多问题。有一件重要的事情需要注意:可以像上面描述的那个去创建工作环境,因为swing的源代码是可以得到的。学习java源代码也能够让你成为更好的程序员并且让你理解工作在java api的内部机制。当你开发你自己习惯的gui组件,这点是有用的。
总结:
java作为一种网络技术,为了在浏览器中能够运行小应用程序而发布,但是它从开始就有运行独立的桌面应用程序的能力。不幸的是,awt没有提供足够的桌面端的程序所需的特性。swing着手于解决这些问题,但是它有不少的bug。今天,java有构建大型桌面端应用程序的能力并修复了bug。java独有的优点是“只写一次,到处运行“――在windows, linux, mac和其它操作系统上运行java代码的能力。
闽公网安备 35060202000074号