可访问性

Swing框架的一个标准部分就是对于辅助技术的支持。这些技术使得我们的Swing程序可以为具有身体缺陷的人所使用。一些用户需要屏蔽阅读器,声音或是不需要鼠标的输入模式。无鼠标的输入通常是通过键盘实现的,但是也可能是通过特殊的输入设置实现,例如语音设备。

用户并不需要具有身体缺陷来体验作为开发者的我们可以用来使得我们的程序更容易访问的选项。例如,我们可以添加工具提示文本,当用户将鼠标放置在组件上时可以看到。使用辅助设备的具有视觉限制的用户可以依赖这些文本来使用屏幕阅读器描述组件。其他选项包含键盘快捷键与菜单热键,这些都可以使得用户在屏幕中浏览并且使用最小的手部运动来激活动作。

本章将会提供一些建议来帮助我们创建符合美国联邦法案的程序。


22.1 Accessibility类

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提供了核心框架。


22.1.1 Accessible接口

对于在可访问性框架之内工作的Swing组件而言,他必须实现Accessible接口。

public interface Accessible {
  // Property
  public AccessibleContext getAccessibleContext();
}

正如其接口定义所示,其只有一个方法,就是为实现类获取当前的AccessibleContext实例。所有的标准AWT与Swing组件都实现了这个接口。一些组件内部部分,例如在JInternalFrame标题面板上的系统菜单栏,也实现了Accessible接口。


22.1.2 AccessibleContext类

尽管所有的组件必须实现Accessible接口,而实际所完成的工作是在他所返回的AccessibleContext实例内部完成的。所返回的环境实际是另一个组件。他将可访问属性映射到组件属性。例如,对于JLable组件,当我们获取其AccessibleContext时,我们实际上获取的是一个名为AccessibleJLabel的派生类。这个子类映射JLabel属性,例如accessibleName属性映射到text属性。如表22-1所示,抽象类本身要比较接口大得多。


如表22-1所示,在javax.accessibility包中还有一些其他类。然而,实际上,我们并不需要担心这些,只要我们创建的组件与屏幕是可访问的即可。


22.2 创建可访问的组件

本节提供一些建议来帮助我们创建在使用辅助技术时可以访问的程序。这并不意味着一个冗长的列表,但是他确实提供了一个有益技术的概述。

  1. 首要的一点,尝试在没有鼠标的情况下使用我们的程序。我们的菜单是否支持快捷键与热键?我们的按钮是否具有与其相关联的热键?我们的文本域是否具有通过setLabelFor()方法设置与其相关联的标签,并且每一个标签具有热键?
  2. 确保我们的组件具有一个与其相关联的简短文本。如果一个组件,例如仅有图片的按钮,没有相关联的字符串,调用AccessibleContext的setAccessibleName()方法 。记住,如果我们的程序目标是国际用户,一定要本地化其名字。
  3. 尽可能使用工具提示文本。如果在一个组件上具有工具提示文本并不合适,记住调用setAccessibleDescription()。
  4. 我们的自定义组件是否可访问?如果我们派生JComponent,则该类并没有实现Accessible接口。但是如果我们派生JPanel,则已经实现Accessible接口。然而,尽管JPanel实现了此接口,我们的组件也许并没有提供必需的可访问性信息。在合适的情况下,考虑扩展JComponent生成我们自定义的AccessibleContext,AccessibleJComponent。
  5. 位于不可访问容器内的组件也是不可访问的。记住使用JPanel作为我们的容易,而不是AWT的Container类,来保证我们的屏幕是可访问的。


22.3 使用Java访问桥

如果我们恰好在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("<html>Tooltip<br>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信息的示例。



22.4 小结

本章探讨了Swing API如何有助于使得我们的程序同时对于正常用户与身体有缺陷的用户更具有可访问性。通过遵循本章中的一些建议,我们可以程序可以更好的行使联邦与国际用户。借助于Java Monkey与Ferret程序,我们可以发现是否向需要可访问性特性的用户公开了足够的属性。

这就要结束我们的Swing旅程了。记住访问由Sun在http://www.theswingconnection.com/ 的Swing连接来跟踪最新的发展。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值