用户并不需要具有身体缺陷来体验作为开发者的我们可以用来使得我们的程序更容易访问的选项。例如,我们可以添加工具提示文本,当用户将鼠标放置在组件上时可以看到。使用辅助设备的具有视觉限制的用户可以依赖这些文本来使用屏幕阅读器描述组件。其他选项包含键盘快捷键与菜单热键,这些都可以使得用户在屏幕中浏览并且使用最小的手部运动来激活动作。
本章将会提供一些建议来帮助我们创建符合美国联邦法案的程序。
javax.accessibility包最常用与最少用到的包。为了保证我们正确的配置我们的Swing组件,所有的事情都在幕后进行。当一个使用辅助设备的用户运行程序时,Java Accessibitity API就会进入并为设备提供必要的信息。例如,当创建一个ImageIcon,有两个构造函数集合:具有description参数以及没有description参数的。
// Without description argument
public ImageIcon()
public ImageIcon(Image image)
public ImageIcon(String filename)
public ImageIcon(URL location)
public ImageIcon(byte imageData[])
// With description argument
public ImageIcon(Image image, String description)
public ImageIcon(String filename, String description)
public ImageIcon(URL location, String description)
public ImageIcon(byte imageData[], String description)
通过使用带有描述参数的构造函数创建ImageIcon,我们的程序就会自动的变得具有更好的访问性。创建使用带有description参数的构造函数创建图标以外,我们还可以稍后通过setDescription()方法设置文本。
一个重要的接口,Accessible,与一个抽象类,AccessibleContext,为Java Accessibility API提供了核心框架。
对于在可访问性框架之内工作的Swing组件而言,他必须实现Accessible接口。
public interface Accessible {
// Property
public AccessibleContext getAccessibleContext();
}
正如其接口定义所示,其只有一个方法,就是为实现类获取当前的AccessibleContext实例。所有的标准AWT与Swing组件都实现了这个接口。一些组件内部部分,例如在JInternalFrame标题面板上的系统菜单栏,也实现了Accessible接口。
尽管所有的组件必须实现Accessible接口,而实际所完成的工作是在他所返回的AccessibleContext实例内部完成的。所返回的环境实际是另一个组件。他将可访问属性映射到组件属性。例如,对于JLable组件,当我们获取其AccessibleContext时,我们实际上获取的是一个名为AccessibleJLabel的派生类。这个子类映射JLabel属性,例如accessibleName属性映射到text属性。如表22-1所示,抽象类本身要比较接口大得多。
如表22-1所示,在javax.accessibility包中还有一些其他类。然而,实际上,我们并不需要担心这些,只要我们创建的组件与屏幕是可访问的即可。
本节提供一些建议来帮助我们创建在使用辅助技术时可以访问的程序。这并不意味着一个冗长的列表,但是他确实提供了一个有益技术的概述。
如果我们恰好在Microsoft Windows平台下工作,我们可以尝试Java访问桥,由http://java.sun.com/products/accessbridge/ 可以获得。这个工具很容易使用。
下载accessbridge-1_2.zip之后,解压并运行Install程序,可以在installer子目录中找到。在程序检测Java虚拟机兼容性之后,他会提示我们选择桥安装在哪个兼容的JVM中。如图22-1所示,如果我们恰好在系统有多个JVM,这也许会在多个位置。选择我们最可能使用的一个。这个程序也许还会提示我们移除我们机器上的一些旧版本。以c:\program files\java开头的目录是浏览器Java插件的不同版本。
在点击安装按钮之后,我们会看到一个成功容器,如图22-2所示。安装很快速。
一旦我们安装了这个访问桥,我们就可以像Java Monkey与Java Ferret那样运行程序(没错,这就是他们的真实名字)。一旦运行,这些程序就会将他们关联到在相同的JVM上运行的任何Java程序。例如,我们可以尝试使用Java Monkey运行在第4章所提示的示例程序,如列表22-1所示。
package swingstudy.ch22;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolTip;
public class TooltipSample {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable runner = new Runnable() {
public void run() {
JFrame frame = new JFrame("Tooltip Sample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setToolTipText("Tooltip
Message");
frame.add(panel, BorderLayout.CENTER);
JButton button = new JButton("Hello, world") {
public JToolTip createToolTip() {
JToolTip tip = super.createToolTip();
tip.setBackground(Color.YELLOW);
tip.setForeground(Color.RED);
return tip;
}
public boolean contains(int x, int y) {
if(x<100) {
setToolTipText("Got Green Eggs?");
}
else {
setToolTipText("Got Ham?");
}
return super.contains(x, y);
}
};
button.setToolTipText("Hello, World");
frame.add(button, BorderLayout.NORTH);
frame.setSize(300, 150);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}
我们将会看到图22-3所示的结果。如果我们没有立即看到组件树,选择Java Monkey容器中File菜单下的Refresh Tree选项。
选择Panels菜单下的Accessibility API Panel选项来查看通过AccessibleContext可以获得的信息,例如名字,描述,以及角色。图22-4显示了一个示例。记住向下滚动来查看所有可用的信息。
Java访问桥所提供的另一个程序就是Java Ferret。这是一个跟踪程序,其中我们可以全能不同事件的跟踪,例如鼠标,焦点以及菜单选择。如果我们全能了鼠标跟踪,我们将会程序的更新。图22-5显示了当我们在示例工具提示文本程序中的JButton上面移动鼠标时所显示的Java Ferret信息的示例。
本章探讨了Swing API如何有助于使得我们的程序同时对于正常用户与身体有缺陷的用户更具有可访问性。通过遵循本章中的一些建议,我们可以程序可以更好的行使联邦与国际用户。借助于Java Monkey与Ferret程序,我们可以发现是否向需要可访问性特性的用户公开了足够的属性。
这就要结束我们的Swing旅程了。记住访问由Sun在http://www.theswingconnection.com/ 的Swing连接来跟踪最新的发展。