java语音.doc_第1页
java语音.doc_第2页
java语音.doc_第3页
java语音.doc_第4页
java语音.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java 2用户界面自从Java语言出现的早期到现在,图形和用户界面功能已取得了飞跃式的发展。Java2平台包含一个复杂的跨平台的用户界面体系结构,它的组成包括众多的高级组件、一个先进的,功能丰富的,独立于设备的图形系统和许多的多媒体扩展。在本文中,我们将探究这个进步,详细审视当前1.3版本的功能,最后展望一下未来,看看发行版1.4会提供些什么。请点击文章顶部或底部的讨论,在论坛与本文作者和其他读者分享您对本文的看法。在Java 2平台发行之前,抽象窗口工具包(Abstract Window Toolkit,AWT)是Java平台的图形功能的范围。例如Swing等各种技术都是作为可选的扩展被引入的。在Java 2平台上,这些扩展中的大部分都可以在平台的核心中找到它们的一席之地,成为Java基础类(Java Foundation Classes,JFC)的一部分。JFC指的是包含在Java 2平台内的一整套图形和用户界面技术,包括AWT和Swing等。在本文中,我们将讨论JFC的每个主要组件,并讨论一些可选的扩展。JFC的核心:SwingSwing是一个带有一套丰富组件的GUI工具包,它组成了JFC的用户界面功能的核心部分。它不仅是AWT所提供的组件的替代品,并且在这些组件的基础上有了很大进步。当集成有优先权时在JDK首次发行时,与本机平台的集成被认为具有优先权,于是AWT提供了一些组件,这些组件使用各平台的本机组件(在Java编程术语中,这些被称为重量级组件)来实现。例如,在UNIX平台上,java.awt.Button类是用窗口小部件MotifPushButton实现的。相同的Java应用程序在每个平台上都有不同的外观,但本意是不同的实现在功能上是等同的。当然,这也是问题开始的地方。在简单的界面里,这种等同是真的。但随着复杂性的增加,情况就不一样了,这只是因为组件的不同,而且在某些情况下,不管修正了多少错误,并且AWT的部件被重写了多少次,它们总会表现得有一点不同。由于将优先权赋予集成而产生的另一个问题是功能性问题。AWT只提供了有限的一套组件,是因为“最小公分母”方法只有当一个特殊的组件或功能在每个平台上都可用的时候才能够被提供。一个典型的示例就是鼠标键。在以前的JDK1.0.2中,是无法区分鼠标键的点击的,因为Macintosh只有一个鼠标键,所以其它的每个平台都要表现得好像自己也只支持一个鼠标键一样。语言自身已经变得不只是一种平台了,GUI也正在朝着在所有平台上都有相同的外观和行为这种方向转变。为了实现这个目标,本机组件必须尽量地丢弃。但是,显然一些本机代码还是必需的。如果不包含X System Window的调用,您就不能在UNIX上显示一个窗口。现在来看一下Swing,它使用AWT的一个子集来实现这个目标,这个子集包括基本画图操作和java.awt包中的某些类(包括Container、Window、Panel、Dialog和Frame)。所有可能的方法中最好的Swing没有完全遵循“Java语言作为一个平台”的路线。相反,它通过提供一个可以返回本机平台的桥梁,把两种方法的精华部分结合起来了。建立这个桥梁的机制被称为可插式Look-and-Feel(它很接近主题的概念,在linux社区中非常流行)。每一个Swing组件都有一个自己的功能模型和一个独立的外观(look-and-feel),这可以预先设置或在运行时更改。Swing为Windows平台和Motif平台分别提供一个Java look-and-feel(以前称为Metal),同时为Macintosh平台提供一个Java look-and-feel(作为额外选项)。平台的look-and-feel不像AWT一样使用平台的本机组件。相反,它们使用轻量级组件,有和本机组件一样的外观。这对于功能性来说是好的,但在外观上或行为上总有一些不同,所以复杂的界面永远不会和使用本机组件的界面完全相同。另外,您可以制作自己的look-and-feel。当您为高度专门化的应用程序制作一个look-and-feel,或为一系列应用程序提供一个共同的look-and-feel时,这是一种强大的功能。图1、图2和图3展示了每一个主要的look-and-feel的屏幕。图1. Java look-and-feel图3. Motif look-and-feel要了解在发行版1.4中Swing有什么新特性,您可以跳到本文最后一部分,1.4版本中对 UI做的更改。独立于平台的拖放JDK 1.1增加了一个通用机制,这种机制放在java.awt.datatransfer包中,实现了应用程序之间和应用程序内部的数据传输,以及对系统剪贴板的操作能力。Java 2版本引入了java.awt.dnd包。此包建立在数据传输的机制上,提供了拖放功能,这些功能可以在一个单独的Java应用程序内或两个Java应用程序之间以一种平台无关的方式执行。为了集成本机平台的拖放功能,它也可以以一种平台相关的方式运行。使用拖放(Drag and Drop,DND)API很具有挑战性,因为它要操作在很高的抽象度上来支持它工作的不同方式,同时也因为它被设计成操作被java.awt.datatransfer.Transferable接口所指定的任意数据类型。让我们看一个示例。DND API如何工作首先,需要一个DragSource对象来初始化拖放操作。该对象被用于创建一个DragGestureRecognizer,它规定标明拖动操作开始点的事件。例如,在一个特定组件上按下鼠标左键然后移动鼠标。系统一识别到此动作,可利用DragSource对象通过要传输的信息来定义操作的开始点。下一步,拖动操作的有效目的地可通过向DropTarget对象传送一个组件或者调用Component的新的setDropTarget()方法来定义。实现DropTargetListener接口的类可用来响应拖放操作中可能出现的各种事件。主要事件是放操作,一个DropTargetDropEvent对象被传送给该操作。可向该对象查询被拖动的数据的类型。侦听器可以拒绝或者接受拖动并传输数据,完成拖放操作。方便残疾人士:辅助选项(Accessibility)Java应用程序配备有JFC Accessibility API(JFC辅助选项API),所以可以被具有各种能力的用户访问,包括视力、听力或行动不便的用户。这些可能包括不能分辨视觉或听觉信号或者不能操作定位设备。辅助选项支持的两大重要功能就是屏幕读取器和屏幕放大镜。屏幕读取器允许用户通过创建界面的off-screen表示,并将其传送到一个语音合成器或盲文终端来与GUI进行交互。屏幕放大镜提供一个屏幕的放大窗口,典型情况下是正常大小的2到16倍。它们通常不断跟踪指针的移动和输入焦点的改变,然后相应地调整放大的窗口。另外,象平滑字体这样的技术可能会用于生成更清晰的图像。Java Accessibility Bridge(Java辅助选项Bridge)一些主机系统,如Microsoft Windows,提供它们自己的辅助选项功能。缺省情况下,Java应用程序并不完全支持它们。例如,对于本机应用程序,屏幕放大器探测输入焦点何时转换到另一个不同的用户界面组件(例如通过使用Tab键),然后调整放大的屏幕部分,来显示当前拥有输入焦点的组件。然而,Swing应用程序使用的是轻量级的组件,操作系统将这些组件作为图像处理,而不作为离散的组件来处理。这就意味着屏幕放大器不能象本机应用程序那样在输入焦点中跟踪发生的改变。这正好就是面向Windows的Java Accessibility Bridge所要解决的问题。它在与轻量级组件有关的事件和本机系统事件之间建立一个映射。使用这个Bridge,支持Accessibility API的Java应用程序就可以与Windows辅助选项支持完全集成。本文结束处的参考资料提供了更多与辅助选项有关的参考资料的链接。从简单到先进:Java 2D在Java 2平台之前,语言中的图形功能相当简单,仅限于单像素厚度的实线;少数几个几何图形(如椭圆、弧和多边形);和基本的画图功能。随着Java 2D API(它包含一个真正的功能集)的出现,所有的一切都改变了。这个API的核心是由java.awt.Graphics2D类提供的,该类是java.awt.Graphics的一个子类。API的其它部分由java.awt层次结构中的其它包提供,包括java.awt.color、java.awt.font和java.awt.geom。java.awt.Graphics2D类这个类是java.awt.Graphics(该类在Java 2发行前就提供图形功能)的一个子类。这样安排的原因是:向后兼容。组件的着色还是通过调用它们的paint()方法,它使用一个Graphics对象。尽管在语言的当前版本中,这个对象真是一个Graphics2D对象。这意味着,paint()方法可以将Graphics对象作为一个Graphics对象使用(使用旧的画图方法),或者将其强制转换成Graphics2D对象。如果使用第二种选择,就可以使用2D API的所有附加功能。java.awt.geom包java.awt.geom包提供一些有关二维几何的类,如Arc2D、Line2D、Rectangle2D、Ellipse2D和CubicCurve2D。其中每一个都是抽象类,他们都是两个名为Double和Float的非抽象内部类(它们是抽象外部类的子类)。这些类允许各种几何图形建立在双精度或浮点精度的坐标系上。例如,newEllipse2D.Float(x,y,w,h)将在(x,y)点上构造一个以宽为w、高为h的矩形为边界的椭圆,其中x、y、w和h都为浮点值。在这个包里还有AffineTransform类,它是组成2D API的核心元素。仿射转换指的是平行线在转换后还保持平行。这种类型的转换示例包括如下的操作:平移、旋转、缩放、剪切或者这些操作的组合。每一个转换都可以用一个3x3的矩阵来表示,该矩阵规定转换的源点和目标点之间的映射。AffineTransform类的实例可以直接从一个浮点值的矩阵中创建,尽管通常情况下是通过规定一个或多个平移、旋转、缩放或剪切操作来创建。多数情况下是使用双精度值,并且角度是用弧度来度量的(而不是Arc2D类中使用的度)。文本着色Java 2D API的文本功能也相当强大。它们包括: 使用抗锯齿处理和微调(hinting)以达到更好的输出质量 可以使用系统安装的所有字体 可以将对图形对象的操作(旋转、缩放、着色、剪切等等)应用到文本上。 支持向字符串添加内嵌属性(如字体、尺寸、深浅,甚至图像) 支持双向文本(启用从右到左的字符顺序,就象您在阿拉伯语和希伯来语中可能遇到的一样) 第一光标和第二光标能够浏览同时包含从右到左和从左到右字符顺序的文本。 先进的字体度量功能,超过旧的java.awt.FontMetrics类中的相应功能 排版功能可以实现单词换行和调整多行文本Java 2D工作的一个示例清单1包含一个使用部分Java 2D方法的基本示例的代码,加上几个其它的方法。这是一个完整的程序,但只是接触了2D API所提供的功能的皮毛。(输出请参见图4)。清单1.一个简单的Java 2D示例importjava.awt.*;importjava.awt.geom.*;publicclass j2d extends Frame publicstatic void main(Stringargs) new j2d(); publicj2d() setSize(220,180);setVisible(true);publicvoid paint(Graphics g) /Obtaina Graphics2D objectGraphics2D g2 = (Graphics2D)g;/ Set the rendering quality.g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);/ define a linearcolourgradientGradientPaintgp= newGradientPaint(0, 60,Color.red,0, 120,Color.yellow);Ellipse2D r = newEllipse2D.Float(30, 60, 160, 60);g2.setPaint(gp);g2.fill(r);/ set rotationg2.transform(AffineTransform.getRotateInstance(Math.PI/8);g2.setFont(new Font(Serif,Font.BOLD, 85);g2.setPaint(Color.blue);/ set compositing rule with transparencyg2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f);g2.drawString(J2D,50,70);图4.清单1的输出要了解更多关于Java 2D API的参考资料,请参阅参考资料。声音终于迎头赶上:Audio API(音频API)Java语言每发行一个主要版本,都会给音频功能带来稳步的提高。JDK的1.1发行版以前(包括1.1发行版)的版本中,可以在java.applet包中找到对8位单声道声音的基本支持。一个AU格式的音频剪辑可以用URL来载入,并且只有三个操作可以使用:播放、停止和循环。1.2发行版中改进了这种情况。从8位到16位Java 2第一个发行版(版本1.2)集成了一个经Beatnik公司许可的新的声音引擎,提供对各种常用格式的16位立体声的支持,包括AU、WAV、AIFF和多种MIDI格式。这个版本中还附加了新的静态方法java.applet.Applet.newAudioClip(),它使得在应用程序中使用声音更加容易,而不仅仅在applet中。然后,1.3版本取得了巨大的进步。Java Sound API(Java声音API)平台的1.3版本取得了目前为止最大的进步。这个版本使用相同的Beatnik声音引擎及以前所有的功能,并增加了一个全新的API Java Sound API。Java Sound API提供了一套扩展的音频功能,并可通过新的javax.media.sound.sampled和javax.media.sound.midi包来访问。javax.media.sound.sampled包包含从各种声源回放声音的类,和最多能混合64声道的类。每一个音频信号可以通过不同的方法进行控制和处理,比如在不同文件格式之间的转换,和对效果(如增益和回响)的使用。同时还支持输入源(例如麦克风)的音频捕捉。javax.media.sound.midi包提供MIDI功能,包括载入音色库和从MIDI数据中生成声音,以及回放MIDI序列。遗漏了什么?硬件加速Java音频功能还缺乏一个重要的方面硬件加速。缺乏这种支持意味着不管您的声卡硬件性能多么优秀,这些功能都无法被使用。这样的结构确实带来了好的跨平台可移植性,但付出的代价是高CPU开销和较低的性能。标准演示包中的JavaSound演示展示了Java Sound API的许多功能。要了解更多相关信息,请参阅参考资料。自动化事件:AWT机器人1.3版本中新加入的java.awt.Robot类被设计成在本机平台上生成输入事件。提供的操作包括: 移动鼠标指针到屏幕上给定的位置 生成鼠标键按下和释放事件 生成键盘按下和释放事件这种功能为测试自动化带来了全新的可能性。例如,一系列事件可以被一次性记录,然后以全自动的方式自动回放任意遍。其它的功能还提供了测试一个屏幕坐标的像素颜色的方法,甚至可以将屏幕上的一整块区域作为一个图像缓冲捕捉下来。要了解AWT在1.4版中有什么新特性,您可以跳到本文的最后部分,1.4版本中对 UI做的更改。多媒体选项:Java Media API(Java媒体API)Java Media API是一套涵盖广泛的多媒体技术领域的资源。其中,如2D API和 声音API是核心J2SE平台的一部分;其余的是目前可选的扩展,不过其中的一些技术在将来无疑会进入核心。这个领域的其它API还有Java 3D、Advanced Imaging(高级图像处理)、Image I/O(图像I/O)、Java Media Framework(JMF,Java媒体框架)和Speech(语音)。Java 3DJava 3D API提供了一套面向对象的接口,支持一种简单的、高级的编程模型,让开发人员可以构建、着色和控制3D对象的行为和可视环境。这个API包括一个详细的规范文档和javax.media.j3d、javax.vecmath包的实现。Advanced Imaging这个规范所涵盖的操作将提高用户处理图像的能力。它包括的操作有对比度增强、剪切、缩放、几何弯曲和频率范围处理。这种类型的功能可应用于各种领域,如天文学、医学图像处理、科学目视表示、气象学和摄影。Image I/O这种API定义了一种可读写不同格式图像的可插式框架。这种新的API正在由Java Community Process设计。Java Media Framework(JMF)JMF是一种API,可以将音频、视频和其它基于时间的媒体整合到Java应用程序和applet中。这个可选的包扩展了J2SE平台的多媒体功能。SpeechJava Speech API允许开发人员将语音技术整合到Java applet和应用程序的用户界面中。这种API规定一个跨平台的接口来支持命令控制识别器、听写系统和语音合成器。这个综合API被分成几个规范: Java Speech API规范(Java Speech API Specification,JSAPI) Java Speech API程序员指南 Java Speech API语法格式规范(Java Speech API Grammar Format Specification,JSGF) Java Speech API标记语言规范(Java Speech API Markup Language Specification,JSML)这个API没有Sun公司的参考实现,但是有许多第三方实现,包括Speech for Java(可以从IBMalphaWorks获得),它使用ViaVoice来支持语音命令识别、听写和文本到语音的合成。清单2.举例说明了Java Speech API中的语音合成。它还使用JSML来控制合成器朗读文本的方式(定义音高、速度、重音等等)。清单2.合成和JSMLimportjavax.speech.synthesis.*;publicclassTrySpeechpublicstatic void main(Stringargs) Synthesizersynthesizer=Central.createSynthesizer(null);synthesizer.allocate();trysynthesizer.speak(Hello I am a computer, null);synthesizer.speak(Hello I am a computer, null);synthesizer.speak(Hello I am a computer,null); catch (Exception e)e.printStackTrace(); 要了解Speech API另外的信息,请参阅参考资料。1.4版本中对UI做的更改即将发行的发行版,版本1.4(代号为Merlin)将展示许多新功能,同时还对许多错误进行了必需的修正。我们将重点阐述其中的一些变化。Swing有什么新特性Merlin发行版将给Swing工具包带来广泛的提高。新功能包括: 一个用于不确定时间的进度条,它将向用户说明操作,而不用确定完成的程度。在您预先不知道某些事会用掉多少时间时,这些组件将会很有用(例如建立网络连接)。 JSpinner组件,它让用户使用箭头按钮在列表中滚动,从一个有序的列表中进行选择。 JFormattedTextField组件,它让开发人员限制文本组件中允许的字符集。这个功能在输入日期和数字时非常有用。 增强了新的JTabbedPane以允许可滚动的制表页。目前当制表页不适合全部放在一行时,它们就会溢出到多个行中去,这对于用户来说是非常糟糕的,因为在选择另一行的制表页时窗格就必须重新排列制表页。这里采用的另一种办法时将所有的制表页保持在一行,但是提供箭头按钮来实现沿着行的滚动。 Windows look-and-feel的增强使其能够更紧密地匹配本机平台。这些增强包括为匹配Windows 2000而对外观所做的改变,比如标题栏的渐近填充,以及与Windows桌面更好的集成以响应用户对桌面设置的更改。 大量的错误被修正,还有一些较小的增强,包括为Swing事件附加声音的功能。AWT得到一个新的焦点模型在发行版1.4中AWT被赋予一种全新的焦点模型,很久以来这一直是个问题区域。现有的焦点模型非常令人头痛,因为它存在无数的错误,并且功能很少,比如不能查询当前哪个组件拥有焦点。产生问题的原因通常是:不同的平台处理输入焦点的方式不同,以及新的轻量级组件要求单独处理焦点所带来的复杂性。新模型已经尽可能使用共享代码实现;平台相关的代码被最小化。新模型的核心是java.awt.KeyboardFocusManager类。这个类将提供公共API调用来查询和设置焦点状态的许多方面,比如当前哪个组件享有焦点,还有焦点遍历循环中组件的顺序。最后一点:新的焦点模型与当前各个版本不是完全向后兼容的,所以现有的应用程序将需要彻底的测试。其它AWT功能用一个滚动轮作为鼠标中键的鼠标非常流行,所以增加了对它的支持。它采用的形式为,一个新的MouseWheelEvent类、一个MouseWheelListener接口和一个新的java.awt.Component类的add

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论