xp sp3 安装版-手机无线上网慢
![很皮语音包](/uploads/image/0498.jpg)
2023年4月4日发(作者:svn连接)
Java2用户界面
自从Java语言出现的早期到现在,图形和用户界面功能已取得了飞跃式的发展。Java2平台包含一个复杂的跨平台的用户界面体系结构,它的组成包
括众多的高级组件、一个先进的,功能丰富的,独立于设备的图形系统和许多的多媒体扩展。在本文中,我们将探究这个进步,详细审视当前1.3版本
的功能,最后展望一下未来,看看发行版1.4会提供些什么。请点击文章顶部或底部的讨论,在论坛与本文作者和其他读者分享您对本文的看法。
在Java2平台发行之前,抽象窗口工具包(AbstractWindowToolkit,AWT)是Java平台的图形功能的范围。例如Swing等各种技术都是作为可选的
扩展被引入的。在Java2平台上,这些扩展中的大部分都可以在平台的核心中找到它们的一席之地,成为Java基础类(JavaFoundationClasses,
JFC)的一部分。JFC指的是包含在Java2平台内的一整套图形和用户界面技术,包括AWT和Swing等。在本文中,我们将讨论JFC的每个主要组
件,并讨论一些可选的扩展。
JFC的核心:Swing
Swing是一个带有一套丰富组件的GUI工具包,它组成了JFC的用户界面功能的核心部分。它不仅是AWT所提供的组件的替代品,并且在这些组件
的基础上有了很大进步。
当集成有优先权时
在JDK首次发行时,与本机平台的集成被认为具有优先权,于是AWT提供了一些组件,这些组件使用各平台的本机组件(在Java编程术语中,这些
被称为重量级组件)来实现。例如,在UNIX平台上,类是用窗口小部件MotifPushButton实现的。
相同的Java应用程序在每个平台上都有不同的外观,但本意是不同的实现在功能上是等同的。当然,这也是问题开始的地方。在简单的界面里,这种
等同是真的。但随着复杂性的增加,情况就不一样了,这只是因为组件的不同,而且在某些情况下,不管修正了多少错误,并且AWT的部件被重写了
多少次,它们总会表现得有一点不同。
由于将优先权赋予集成而产生的另一个问题是功能性问题。AWT只提供了有限的一套组件,是因为“最小公分母”方法―只有当一个特殊的组件或功能
在每个平台上都可用的时候才能够被提供。一个典型的示例就是鼠标键。在以前的JDK1.0.2中,是无法区分鼠标键的点击的,因为Macintosh只有一
个鼠标键,所以其它的每个平台都要表现得好像自己也只支持一个鼠标键一样。
语言自身已经变得不只是一种平台了,GUI也正在朝着在所有平台上都有相同的外观和行为这种方向转变。为了实现这个目标,本机组件必须尽量地丢
弃。但是,显然一些本机代码还是必需的。如果不包含XSystemWindow的调用,您就不能在UNIX上显示一个窗口。
现在来看一下Swing,它使用AWT的一个子集来实现这个目标,这个子集包括基本画图操作和包中的某些类(包
括Container、Window、Panel、Dialog和Frame)。
所有可能的方法中最好的
Swing没有完全遵循“Java语言作为一个平台”的路线。相反,它通过提供一个可以返回本机平台的桥梁,把两种方法的精华部分结合起来了。
建立这个桥梁的机制被称为可插式Look-and-Feel(它很接近主题的概念,在linux社区中非常流行)。每一个Swing组件都有一个自己的功能模
型和一个独立的外观(look-and-feel),这可以预先设置或在运行时更改。
Swing为Windows平台和Motif平台分别提供一个Javalook-and-feel(以前称为Metal),同时为Macintosh平台提供一个Javalook-and-
feel(作为额外选项)。平台的look-and-feel不像AWT一样使用平台的本机组件。相反,它们使用轻量级组件,有和本机组件一样的外观。这对于
功能性来说是好的,但在外观上或行为上总有一些不同,所以复杂的界面永远不会和使用本机组件的界面完全相同。
另外,您可以制作自己的look-and-feel。当您为高度专门化的应用程序制作一个look-and-feel,或为一系列应用程序提供一个共同的look-and-
feel时,这是一种强大的功能。
图1、图2和图3展示了每一个主要的look-and-feel的屏幕。
图ok-and-feel
图ook-and-feel
要了解在发行版1.4中Swing有什么新特性,您可以跳到本文最后一部分,1.4版本中对UI做的更改。
独立于平台的拖放
JDK1.1增加了一个通用机制,这种机制放在ansfer包中,实现了应用程序之间和应用程序内部的数据传输,以及对系统剪贴板的
操作能力。
Java2版本引入了包。此包建立在数据传输的机制上,提供了拖放功能,这些功能可以在一个单独的Java应用程序内或两
个Java应用程序之间以一种平台无关的方式执行。为了集成本机平台的拖放功能,它也可以以一种平台相关的方式运行。
使用拖放(DragandDrop,DND)API很具有挑战性,因为它要操作在很高的抽象度上来支持它工作的不同方式,同时也因为它被设计成操作
被erable接口所指定的任意数据类型。让我们看一个示例。
DNDAPI如何工作
首先,需要一个DragSource对象来初始化拖放操作。该对象被用于创建一个DragGestureRecognizer,它规定标明拖动操作开始点的事件。例如,
在一个特定组件上按下鼠标左键然后移动鼠标。
系统一识别到此动作,可利用DragSource对象通过要传输的信息来定义操作的开始点。
下一步,拖动操作的有效目的地可通过向DropTarget对象传送一个组件或者调用Component的新的setDropTarget()方法来定义。
实现DropTargetListener接口的类可用来响应拖放操作中可能出现的各种事件。主要事件是放操作,一个DropTargetDropEvent对象被传送给该操
作。可向该对象查询被拖动的数据的类型。
侦听器可以拒绝或者接受拖动并传输数据,完成拖放操作。
方便残疾人士:辅助
选项(Accessibility)
Java应用程序配备有JFCAccessibilityAPI(JFC辅助选项API),所以可以被具有各种能力的用户访问,包括视力、听力或行动不便的用户。这
些可能包括不能分辨视觉或听觉信号或者不能操作定位设备。
辅助选项支持的两大重要功能就是屏幕读取器和屏幕放大镜。屏幕读取器允许用户通过创建界面的off-screen表示,并将其传送到一个语音合成器或
盲文终端来与GUI进行交互。屏幕放大镜提供一个屏幕的放大窗口,典型情况下是正常大小的2到16倍。它们通常不断跟踪指针的移动和输入焦点
的改变,然后相应地调整放大的窗口。另外,象平滑字体这样的技术可能会用于生成更清晰的图像。
JavaAccessibilityBridge(Java辅助选项Bridge)
一些主机系统,如MicrosoftWindows,提供它们自己的辅助选项功能。缺省情况下,Java应用程序并不完全支持它们。例如,对于本机应用程序,
屏幕放大器探测输入焦点何时转换到另一个不同的用户界面组件(例如通过使用Tab键),然后调整放大的屏幕部分,来显示当前拥有输入焦点的组
件。
然而,Swing应用程序使用的是轻量级的组件,操作系统将这些组件作为图像处理,而不作为离散的组件来处理。这就意味着屏幕放大器不能象本机应
用程序那样在输入焦点中跟踪发生的改变。
这正好就是面向Windows的JavaAccessibilityBridge所要解决的问题。它在与轻量级组件有关的事件和本机系统事件之间建立一个映射。使用这
个Bridge,支持AccessibilityAPI的Java应用程序就可以与Windows辅助选项支持完全集成。
本文结束处的参考资料提供了更多与辅助选项有关的参考资料的链接。
从简单到先进:Java
2D
在Java2平台之前,语言中的图形功能相当简单,仅限于单像素厚度的实线;少数几个几何图形(如椭圆、弧和多边形);和基本的画图功能。随
着Java2DAPI(它包含一个真正的功能集)的出现,所有的一切都改变了。
这个API的核心是由cs2D类提供的,该类是cs的一个子类。API的其它部分由层次结构中的其它包
提供,包括、和。
cs2D类
这个类是cs(该类在Java2发行前就提供图形功能)的一个子类。这样安排的原因是:向后兼容。组件的着色还是通过调用它们
的paint()方法,它使用一个Graphics对象。
尽管在语言的当前版本中,这个对象真是一个Graphics2D对象。这意味着,paint()方法可以将Graphics对象作为一个Graphics对象使用(使
用旧的画图方法),或者将其强制转换成Graphics2D对象。如果使用第二种选择,就可以使用2DAPI的所有附加功能。
包
包提供一些有关二维几何的类,如Arc2D、Line2D、Rectangle2D、Ellipse2D和CubicCurve2D。其中每一个都是抽象类,他
们都是两个名为Double和Float的非抽象内部类(它们是抽象外部类的子类)。
这些类允许各种几何图形建立在双精度或浮点精度的坐标系上。例如,(x,y,w,h)将在(x,y)点上构造一个以宽为w、高
为h的矩形为边界的椭圆,其中x、y、w和h都为浮点值。
在这个包里还有AffineTransform类,它是组成2DAPI的核心元素。仿射转换指的是平行线在转换后还保持平行。这种类型的转换示例包括如下的
操作:平移、旋转、缩放、剪切或者这些操作的组合。每一个转换都可以用一个3x3的矩阵来表示,该矩阵规定转换的源点和目标点之间的映射。
AffineTransform类的实例可以直接从一个浮点值的矩阵中创建,尽管通常情况下是通过规定一个或多个平移、旋转、缩放或剪切操作来创建。多数情
况下是使用双精度值,并且角度是用弧度来度量的(而不是Arc2D类中使用的度)。
文本着色
Java2DAPI的文本功能也相当强大。它们包括:
使用抗锯齿处理和微调(hinting)以达到更好的输出质量
可以使用系统安装的所有字体
可以将对图形对象的操作(旋转、缩放、着色、剪切等等)应用到文本上。
支持向字符串添加内嵌属性(如字体、尺寸、深浅,甚至图像)
支持双向文本(启用从右到左的字符顺序,就象您在阿拉伯语和希伯来语中可能遇到的一样)
第一光标和第二光标能够浏览同时包含从右到左和从左到右字符顺序的文本。
先进的字体度量功能,超过旧的trics类中的相应功能
排版功能可以实现单词换行和调整多行文本
Java2D工作的一个示例
清单1包含一个使用部分Java2D方法的基本示例的代码,加上几个其它的方法。这是一个完整的程序,但只是接触了2DAPI所提供的功能的皮毛。
(输出请参见图4)。
清单1.一个简单的Java2D示例
.*;
.*;
publicclassj2dextendsFrame{
publicstaticvoidmain(Stringargs[]){newj2d();}
publicj2d(){
setSize(220,180);
setVisible(true);
}
publicvoidpaint(Graphicsg){
//ObtainaGraphics2Dobject
Graphics2Dg2=(Graphics2D)g;
//Settherenderingquality.
deringHint(_ANTIALIASING,
_ANTIALIAS_ON);
//definealinearcolourgradient
GradientPaintgp=newGradientPaint(0,60,,
0,120,);
Ellipse2Dr=(30,60,160,60);
nt(gp);
(r);
//setrotation
orm(ateInstance(/8));
t(newFont("Serif",,85));
nt();
//setcompositingrulewithtransparency
posite(tance(
_OVER,0.5f));
ring("J2D",50,70);
}
}
图4.清单1的输出
要了解更多关于Java2DAPI的参考资料,请参阅参考资料。
声音终于迎头赶上:AudioAPI(音频API)
Java语言每发行一个主要版本,都会给音频功能带来稳步的提高。JDK的1.1发行版以前(包括1.1发行版)的版本中,可以在包中
找到对8位单声道声音的基本支持。一个AU格式的音频剪辑可以用URL来载入,并且只有三个操作可以使用:播放、停止和循环。1.2发行版中改
进了这种情况。
从8位到16位
Java2第一个发行版(版本1.2)集成了一个经Beatnik公司许可的新的声音引擎,提供对各种常用格式的16位立体声的支持,包括AU、WAV、
AIFF和多种MIDI格式。
这个版本中还附加了新的静态方法ioClip(),它使得在应用程序中使用声音更加容易,而不仅仅在applet中。然后,
1.3版本取得了巨大的进步。
JavaSoundAPI(Java声音API)
平台的1.3版本取得了目前为止最大的进步。这个版本使用相同的Beatnik声音引擎及以前所有的功能,并增加了一个全新的API―JavaSound
API。
JavaSoundAPI提供了一套扩展的音频功能,并可通过新的d和包来访问。
d包包含从各种声源回放声音的类,和最多能混合64声道的类。每一个音频信号可以通过不同的方法进行控制和处理,比
如在不同文件格式之间的转换,和对效果(如增益和回响)的使用。同时还支持输入源(例如麦克风)的音频捕捉。
包提供MIDI功能,包括载入音色库和从MIDI数据中生成声音,以及回放MIDI序列。
遗漏了什么?硬件加速
Java音频功能还缺乏一个重要的方面―硬件加速。缺乏这种支持意味着不管您的声卡硬件性能多么优秀,这些功能都无法被使用。这样的结构确实
带来了好的跨平台可移植性,但付出的代价是高CPU开销和较低的性能。
标准演示包中的JavaSound演示展示了JavaSoundAPI的许多功能。要了解更多相关信息,请参阅参考资料。
自动化事件:AWT机器人
1.3版本中新加入的类被设计成在本机平台上生成输入事件。提供的操作包括:
移动鼠标指针到屏幕上给定的位置
生成鼠标键按下和释放事件
生成键盘按下和释放事件
这种功能为测试自动化带来了全新的可能性。例如,一系列事件可以被一次性记录,然后以全自动的方式自动回放任意遍。其它的功能还提供了测试一
个屏幕坐标的像素颜色的方法,甚至可以将屏幕上的一整块区域作为一个图像缓冲捕捉下来。
要了解AWT在1.4版中有什么新特性,您可以跳到本文的最后部分,1.4版本中对UI做的更改。
多媒体选项:JavaMediaAPI(Java媒体API)
JavaMediaAPI是一套涵盖广泛的多媒体技术领域的资源。其中,如2DAPI和声音API是核心J2SE平台的一部分;其余的是目前可选的扩展,
不过其中的一些技术在将来无疑会进入核心。这个领域的其它API还有Java3D、AdvancedImaging(高级图像处理)、ImageI/O(图像I/O)、
JavaMediaFramework(JMF,Java媒体框架)和Speech(语音)。
Java3D
Java3DAPI提供了一套面向对象的接口,支持一种简单的、高级的编程模型,让开发人员可以构建、着色和控制3D对象的行为和可视环境。
这个API包括一个详细的规范文档和.j3d、h包的实现。
AdvancedImaging
这个规范所涵盖的操作将提高用户处理图像的能力。它包括的操作有对比度增强、剪切、缩放、几何弯曲和频率范围处理。
这种类型的功能可应用于各种领域,如天文学、医学图像处理、科学目视表示、气象学和摄影。
ImageI/O
这种API定义了一种可读/写不同格式图像的可插式框架。这种新的API正在由JavaCommunityProcess设计。
JavaMediaFramework(JMF)
JMF是一种API,可以将音频、视频和其它基于时间的媒体整合到Java应用程序和applet中。这个可选的包扩展了J2SE平台的多媒体功能。
Speech
JavaSpeechAPI允许开发人员将语音技术整合到Javaapplet和应用程序的用户界面中。这种API规定一个跨平台的接口来支持命令―控制识别器、
听写系统和语音合成器。
这个综合API被分成几个规范:
JavaSpeechAPI规范(JavaSpeechAPISpecification,JSAPI)
JavaSpeechAPI程序员指南
JavaSpeechAPI语法格式规范(JavaSpeechAPIGrammarFormatSpecification,JSGF)
JavaSpeechAPI标记语言规范(JavaSpeechAPIMarkupLanguageSpecification,JSML)
这个API没有Sun公司的参考实现,但是有许多第三方实现,包括SpeechforJava(可以从IBMalphaWorks获得),它使用ViaVoice来支持语
音命令识别、听写和文本到语音的合成。
清单2.举例说明了JavaSpeechAPI中的语音合成。它还使用JSML来控制合成器朗读文本的方式(定义音高、速度、重音等等)。
清单2.合成和JSML
sis.*;
publicclassTrySpeech{
publicstaticvoidmain(Stringargs[]){
Synthesizersynthesizer=Synthesizer(null);
te();
try{
("HelloIamacomputer",null);
(
"HelloIama
(
"HelloIama
null);
}catch(Exceptione){tackTrace();}
}
}
要了解SpeechAPI另外的信息,请参阅参考资料。
1.4版本中对UI做的更改
即将发行的发行版,版本1.4(代号为Merlin)将展示许多新功能,同时还对许多错误进行了必需的修正。我们将重点阐述其中的一些变化。
Swing有什么新特性
Merlin发行版将给Swing工具包带来广泛的提高。新功能包括:
一个用于不确定时间的进度条,它将向用户说明操作,而不用确定完成的程度。在您预先不知道某些事会用掉多少时间时,这些组件将会很有用
(例如建立网络连接)。
JSpinner组件,它让用户使用箭头按钮在列表中滚动,从一个有序的列表中进行选择。
JFormattedTextField组件,它让开发人员限制文本组件中允许的字符集。这个功能在输入日期和数字时非常有用。
增强了新的JTabbedPane以允许可滚动的制表页。目前当制表页不适合全部放在一行时,它们就会溢出到多个行中去,这对于用户来说是非常
糟糕的,因为在选择另一行的制表页时窗格就必须重新排列制表页。这里采用的另一种办法时将所有的制表页保持在一行,但是提供箭头按钮来
实现沿着行的滚动。
Windowslook-and-feel的增强使其能够更紧密地匹配本机平台。这些增强包括为匹配Windows2000而对外观所做的改变,比如标题栏的渐近
填充,以及与Windows桌面更好的集成以响应用户对桌面设置的更改。
大量的错误被修正,还有一些较小的增强,包括为Swing事件附加声音的功能。
AWT得到一个新的焦点模型
在发行版1.4中AWT被赋予一种全新的焦点模型,很久以来这一直是个问题区域。现有的焦点模型非常令人头痛,因为它存在无数的错误,并且功能
很少,比如不能查询当前哪个组件拥有焦点。产生问题的原因通常是:不同的平台处理输入焦点的方式不同,以及新的轻量级组件要求单独处理焦点所
带来的复杂性。
新模型已经尽可能使用共享代码实现;平台相关的代码被最小化。新模型的核心是rdFocusManager类。这个类将提供公共API调用
来查询和设置焦点状态的许多方面,比如当前哪个组件享有焦点,还有焦点遍历循环中组件的顺序。
最后一点:新的焦点模型与当前各个版本不是完全向后兼容的,所以现有的应用程序将需要彻底的测试。
其它AWT功能
用一个滚动轮作为鼠标中键的鼠标非常流行,所以增加了对它的支持。它采用的形式为,一个新的MouseWheelEvent类、一
个MouseWheelListener接口和一个新的ent类的addMouseWheelListener()方法(和对应的removeMouseWheelListener()方法)。
增加了对HeadlessJava.的支持。这个增加意味着,在服务器上运行的Java应用程序在没有GUI环境的情况下也仍然能够使用AWT,例如,在内
存中创建图像以便通过网络发出。
最后,其它的更改包括对拖放功能的增强、创建无修饰框架的能力,以及众多错误的修正。
参考资料
您可以参阅本文在developerWorks全球站点上的英文原文.
Sun公司的JFC页面是一个获取更多一般信息的很好的出发点。
Swing资料的一个极好来源是Swing连接。
API文档包括各方面的拖放信息,包括规范。
Java教程在发行的时候缺少拖放信息,但它的确包含几个有用的示例。
Java教程包括一个不错的Java2DAPI概述。
关于JavaAccessibilityBridge的更多信息,请参阅2SE1.3版本文档中的指南。
SwingConnection讨论了Swing和辅助选项。
IBMAccessibilityCenter包含一些有关辅助选项的参考资料,如编写有辅助选项的Java应用程序的指南。
Sun公司的JavaSoundAPI站点包含各种有关音频的信息,包括规范和一个程序员指南。
2001年1月版的IBMDeveloperToolbox杂志包含一篇有关JavaSoundAPI的优秀文章。
JavaMediaAPI页面是多媒体功能的权威性参考。
请参阅IBMalphaWorks上的AIXj3D,获取一个AIX4.3.3或更高版本的基于OpenGL的Java3DAPI实现。
IBM声音系统页面包含关于ViaVoice和其它语音产品的信息。
请参阅IBMalphaWorks上的SpeechforJava,获取使用IBMViaVoice的Java语音API的实现。
Sun公司为1.4发行版提供了一个详细的AWT焦点文档。
Swingmodelfiltering(developerWorks,2001年1月)展示了如何使用过滤器对象来重新解释数据和状态模型。
JohnZukowski在developerWorks上的新专栏Merlin的魔力详细介绍了1.4发行版的新功能,包括JSpinner组件。
从IBM开发人员工具包页面可以获得IBM开发人员工具包和实时环境。
请在developerWorksJava技术专区寻找更多的Java参考资料。
更多推荐
很皮语音包
发布评论