- 如何使用Java Access Bridge,Java Accessibility API(JAAPI)和Java Accessibility Utilities创建可访问的应用程序。Java Access Bridge使某些Java应用程序对Microsoft Windows上的辅助技术可见。JAAPI使您能够创建残障人士可以访问的Java应用程序。Java Accessibility Utilites是一个实用程序类,可帮助辅助技术提供对实现JAAPI的GUI工具包的访问。
本文档适用于希望创建残疾人可以访问的Java应用程序的开发人员。可访问的Java应用程序与辅助技术兼容,例如屏幕阅读器,屏幕放大镜,语音识别系统和可刷新的盲文显示器。
1 Java可访问性概述Java SE提供了Java Access Bridge,Java Accessibility API(JAAPI)和Java Accessibility Utilities,使您能够创建可访问的应用程序。
Java访问桥Java Access Bridge使某些Java应用程序和小程序对于Microsoft Windows上的辅助技术可见(Java与windows应用程序连接的桥梁)。请参阅启用和测试Java Access Bridge 。
Java可访问性APIjavax.accessibility软件包中包含的Java Accessibility API(JAAPI)是Java基础类(JFC)的核心部分之一。JFC是一组全面的图形用户界面组件和基础服务,旨在简化Internet,Intranet和桌面应用程序的部署。JAAPI使您可以创建残疾人可以访问的Java应用程序。可访问的Java应用程序与辅助技术兼容,例如屏幕阅读器,屏幕放大镜,语音识别系统和可刷新的盲文显示器。JAAPI使GUI组件信息可用于辅助技术,从而为用户提供Java应用程序的替代表示和控制。
Swing组件内置了对JAAPI的支持。请参阅Java教程(Java SE 8和更早版本)中的 如何支持辅助技术 。
Java可访问性实用程序包com.sun.java.accessibility.util中包含的Java Accessibility Utilites是一组实用程序类,可帮助辅助技术提供对实现Java Accessibility API的GUI工具箱的访问。 Java Accessibility Utilities监视与UI组件相关的事件。它们还帮助辅助技术获得有关GUI的其他信息,例如鼠标的当前位置或当前具有焦点的窗口。请参阅Java Accessibility Utilities概述 。
可插拔外观Java基础类实现了可插入外观的体系结构。这种体系结构允许用户界面的非视觉表现形式代替或增强应用程序的视觉表现形式。用户界面的表达与每个单独组件的基础结构和数据分开。这是通过将组件的用户界面与其模型分开来实现的。组件的模型是一种结构,它封装了通过用户界面呈现给用户的状态和信息。有关此体系结构的更多信息,请参见Java教程(Java SE 8和更早版本)中的 关于JFC和Swing 。
2 Java Access Bridge概述Java Access Bridge是一项技术,该技术使实现Java Accessibility API的Java应用程序和小程序对于Microsoft Windows系统上的辅助技术可见。
Java Access Bridge是一项在Microsoft Windows动态链接库(DLL)中公开Java Accessibility API的技术,使实现Java Accessibility API的 Java应用程序和小程序对Microsoft Windows系统上的辅助技术可见。
为了使Microsoft Windows系统上可用的现有辅助技术提供对Java应用程序的访问,它们需要某种方式与Java Accessibility API进行通信。 Java Access Bridge支持此通信。
在Microsoft Windows上运行的辅助技术应用程序(例如,屏幕阅读器)与Java Access Bridge DLL通信,后者又通过Java Access Bridge Java库与Java虚拟机通信。这些Java库与Java Accessibility API通信。 Java Accessibility API收集有关Java应用程序中发生的情况的信息,并将其通过Java Access Bridge转发给屏幕阅读器。
3启用和测试Java Access Bridge默认情况下,不启用Java Access Bridge。通过命令行或Windows控制面板启用它。通过运行使用Accessibility API的Java应用程序对其进行测试。
Java Access Bridge支持的Java SE平台Java Access Bridge包含在JRE 7u6和更高版本中。
通过命令行启用Java Access Bridge使用启用Java Access Bridge jabswitch
命令。
运行以下命令(其中%JRE_HOME%
是您的JRE的目录):
%JRE_HOME%\bin\jabswitch -enable
通过控制面板启用Java Access Bridge
通过带有轻松访问中心的控制面板启用Java Access Bridge。
- 单击“ 开始” ,选择“ 控制面板” ,然后选择“ 轻松访问” ,然后选择“ 轻松访问中心” 。或者,按Windows徽标键+ U访问“轻松访问中心”。
- 选择“不使用显示器使用计算机” 。
- 在“ 安装的其他程序 ”部分中,选中“ 启用Java Access Bridge ”复选框(您可能需要向下滚动)。
使用禁用Java Access Bridge jabswitch
命令。
运行以下命令:
%JRE_HOME%\bin\jabswitch -disable
注意:
您无法通过Windows轻松访问中心禁用Java Access Bridge。
测试Java Access Bridge首先安装受支持的辅助技术,然后运行使用Accessibility API的Java应用程序,以测试Java Access Bridge。
- 确保已启用Java Access Bridge。
- 安装支持Java Access Bridge的辅助技术产品,例如以下产品之一:
-
JAWS
-
NonVisual Desktop Access (NVDA)
-
ZoomText
-
Dolphin ScreenReader
-
- 运行使用以下内容的Java应用程序: javax.accessibility包装并确保您的辅助技术产品可以正常使用。
使用jaccessinspector
和jaccesswalker
这些工具是JRE和JDK的一部分,用于测试Java Access Bridge。
的jaccessinspector该工具使用Java Accessibility Utilities API来检查有关Java虚拟机中对象的可访问信息。的jaccesswalker该工具将遍历特定Java虚拟机中的组件树,并在树视图中显示可访问性层次结构。在JRE或JDK中找到这些工具bin
目录。
本主题列出了一些用于64位操作系统的辅助技术的最低版本要求。
-
JAWS :版本13及更高版本
-
NVDA :版本2011.3及更高版本
-
SuperNova :版本13及更高版本
-
Window-Eyes :8.2及更高版本
-
ZoomText :版本10.1.5及更高版本
注意:
64位应用程序需要64位浏览器;特别是如果您使用Internet Explorer,请确保它是64位版本。
4 Java Access Bridge体系结构Java Access Bridge由一组类和DLL组成,它们使辅助技术和Java应用程序之间能够进行通信。
下图显示了Java Access Bridge和Java Accessibility Utilities组件如何相互交互:
图4-1 Java Access Bridge架构图
“图4-1 Java Access Bridge体系结构图”的描述
Java Access Bridge通过以下方式提供了Java Accessibility API的子集: Windows\System32\windowsaccessbridge-64.dll
Windows DLL。 Microsoft Windows上的辅助技术(Native Assistive Techology)将加载并链接到此DLL。 Java Access Bridge还提供javaaccessbridge.dll
,由Java运行时加载。该DLL通过Java Accessibility API以及通过它,用户界面工具包和组件与应用程序进行通信。DLL还通过Java Accessibility Utilities与应用程序进行通信,Java Accessibility Utilities是一个类的集合,这些类合并事件并为辅助技术(以及作为辅助技术的Java Access Bridge)提供应用程序生命周期功能;请参阅Java Accessibility Utilities Overview 。Java Access Bridge的Java组件管理加载到Java运行时中的DLL与Java运行时中其他Java代码之间的通信。Java Access Bridge的Java组件通过以下命令中指定的内容加载到Java SE运行时中: assistive_technologies
属性(请参阅Accessibility属性 ),然后通过Java本机接口(JNI)加载Java端DLL。Java Access Bridge通过Java Accessibility Utilities在辅助技术和Java应用程序之间启用的通信称为进程间通信。
Java Access Bridge API使您能够为与Java应用程序一起使用的Microsoft Windows操作系统开发辅助技术应用程序。它包含本机方法,使您可以查看和操作有关Java应用程序中GUI元素的信息,该信息通过Java Access Bridge转发给您的辅助技术应用程序。
Java Access Bridge API文件Java Access Bridge API可以在四个文件中找到: AccessBridgeCalls.h
和AccessBridgeCalls.c
(API调用), AccessBridgePackages.h
(数据结构),以及AccessBridgeCallbacks.h
(回调)。
Java Access Bridge API文件的位置
在以下位置找到以下Java Access Bridge API包含(头)文件: %JAVA_HOME%\include\win32\bridge
:
-
AccessBridgeCallbacks.h
-
AccessBridgeCalls.h
-
AccessBridgePackages.h
查找文件AccessBridgeCalls.c在JDK源代码存储库中定义了一些关键接口。
Java Access Bridge API调用文件AccessBridgeCalls.h
包含Java Access Bridge API调用。要使用它们,请编译文件AccessBridgeCalls.c
。Java Access Bridge API调用充当您的应用程序和WindowsAccessBridge.dll
。
这两个功能启动和关闭Java Access Bridge。
BOOL initializeAccessBridge();
启动Java Access Bridge。在调用此函数之前,不能使用Java Access Bridge API的任何部分。
BOOL shutdownAccessBridge();
关闭Java Access Bridge。在您的应用程序使用Java Access Bridge完成后(在应用程序存在之前),调用此函数很重要,这样Java Access Bridge才能正确执行内存清理。
注意 :调用函数shutdownAccessBridge不能替代释放JVM维护的任何数据结构;而是将其释放。为此,可以调用函数ReleaseJavaObject 。
网关功能通常,在调用任何其他Java Access Bridge API函数之前,请先调用以下函数:
BOOL IsJavaWindow(HWND window);
检查给定窗口是否实现了Java Accessibility API。
BOOL GetAccessibleContextFromHWND(HWND target, long *vmID, AccessibleContext *ac);
得到AccessibleContext
和vmID
给定窗口的值。许多Java Access Bridge功能需要AccessibleContext
和vmID
价值观。
它们采用指向将处理事件类型的函数的函数指针。如果您不再有兴趣接收这些类型的事件,请再次调用该函数,并传入NULL
值。在文件中找到传递给这些函数所需的函数指针的原型AccessBridgeCallbacks.h
。Java Access Bridge API回调描述了这些原型。
一般功能
void ReleaseJavaObject(long vmID, Java_Object object);
释放Java对象使用的内存object
,在哪里object
是Java Access Bridge返回给您的对象。Java Access Bridge自动维护对它在JVM中返回给您的所有Java对象的引用,因此不会对其进行垃圾回收。为防止内存泄漏,请致电ReleaseJavaObject
完成对Java Access Bridge返回给您的所有Java对象的处理之后。
BOOL GetVersionInfo(long vmID, AccessBridgeVersionInfo *info);
获取您的应用程序正在使用的Java Access Bridge实例的版本信息。您可以使用此信息来确定您的Java Access Bridge版本的可用功能。
注意:
要确定JVM的版本,您需要传递一个有效的vmID
;否则,返回的只是版本号WindowsAccessBridge.DLL
应用程序连接到的文件。
这些功能提供了Java Access Bridge公开的Java Accessibility API的核心。
功能GetAccessibleContextAt
和GetAccessibleContextWithFocus
检索AccessibleContext
对象,它是一个魔术cookie(Java Object
参考) Accessible
对象和JVM cookie。您使用这两个cookie通过Java Access Bridge引用对象。大多数Java Access Bridge API函数要求您传入这两个参数。
注意:
AccessibleContext
对象是64位进程间通信下的64位引用(使用windowsaccessbridge-64.dll
文件)。但是,在JDK 9之前, AccessibleContext
对象是32位进程间通信下的32位引用(使用windowsaccessbridge.dll
没有文件-32
要么-64
在文件名中)。因此,如果要将辅助技术应用程序转换为在64位Windows系统上运行,则需要重新编译辅助技术应用程序。
功能GetAccessibleContextInfo
返回有关的详细信息AccessibleContext
属于JVM的对象。为了提高性能,Java Accessibility API中的各种不同方法一起收集到Java Access Bridge API中的几个例程中,并在struct
价值观。文件AccessBridgePackages.h
定义这些struct
值和Java Access Bridge API回调描述了它们。
功能GetAccessibleChildFromContext
和GetAccessibleParentFromContext
使您能够遍历GUI组件层次结构,从而检索特定GUI对象的第n个子级或父级。
BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent, jint x, jint y, AccessibleContext *ac)
检索AccessibleContext
窗口的对象或鼠标指针下方的对象。
BOOL GetAccessibleContextWithFocus(HWND window, long *vmID, AccessibleContext *ac);
检索AccessibleContext
窗口的对象或具有焦点的对象。
BOOL GetAccessibleContextInfo(long vmID, AccessibleContext ac, AccessibleContextInfo *info);
检索AccessibleContextInfo
的对象AccessibleContext
宾语ac
。
AccessibleContext GetAccessibleChildFromContext(long vmID, AccessibleContext ac, jint index);
返回一个AccessibleContext
代表对象的第n个子对象的对象ac
,其中n由值索引指定。
AccessibleContext GetAccessibleParentFromContext(long vmID, AccessibleContext ac);
返回一个AccessibleContext
代表对象父对象的对象ac
。
HWND getHWNDFromAccessibleContext(long vmID, AccessibleContext ac);
从顶级窗口的AccessibleContext返回HWND 。
无障碍文字功能这些功能得到AccessibleText
Java Accessibility API提供的信息,为了提高效率分为七个部分。一个AccessibleContext
拥有AccessibleText
如果设置标志,其中包含的信息accessibleText
在里面AccessibleContextInfo
数据结构TRUE
。文件AccessBridgePackages.h
定义struct
这些功能中使用的值Java Access Bridge API回调描述了它们。
BOOL GetAccessibleTextInfo(long vmID, AccessibleText at, AccessibleTextInfo
*textInfo, jint x, jint y);
BOOL GetAccessibleTextItems(long vmID, AccessibleText at, AccessibleTextItemsInfo
*textItems, jint index);
BOOL GetAccessibleTextSelectionInfo(long vmID, AccessibleText
at, AccessibleTextSelectionInfo *textSelection);
char *GetAccessibleTextAttributes(long vmID, AccessibleText
at, jint index, AccessibleTextAttributesInfo *attributes);
BOOL GetAccessibleTextRect(long vmID, AccessibleText at, AccessibleTextRectInfo
*rectInfo, jint index);
BOOL GetAccessibleTextRange(long vmID, AccessibleText at, jint
start, jint end, wchar_t *text, short len);
BOOL GetAccessibleTextLineBounds(long vmID, AccessibleText
at, jint index, jint *startIndex, jint *endIndex);
附加文字功能
BOOL selectTextRange(const long vmID, const AccessibleContext accessibleContext, const int startIndex, const int endIndex);
在两个索引之间选择文本。选择内容包括开始索引处的文本和结束索引处的文本。返回是否成功。
BOOL getTextAttributesInRange(const long vmID, const AccessibleContext accessibleContext, const int startIndex, const int endIndex, AccessibleTextAttributesInfo *attributes, short *len);
获取两个索引之间的文本属性。属性列表包括在开始索引处的文本和在结束索引处的文本。返回是否成功。
BOOL setCaretPosition(const long vmID, const AccessibleContext accessibleContext, const int position);
将插入符号设置为文本位置。返回是否成功。
BOOL getCaretLocation(long vmID, AccessibleContext ac, AccessibleTextRectInfo *rectInfo, jint index);
获取文本插入符号的位置。
BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text);
设置可编辑的文本内容。AccessibleContext必须实现AccessibleEditableText并且是可编辑的。可以设置的最大文字长度为MAX_STRING_SIZE - 1
。返回是否成功。
BOOL getAccessibleTableInfo(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
返回有关表的信息,例如标题,摘要,行和列数以及AccessibleTable。
BOOL getAccessibleTableCellInfo(long vmID, AccessibleTable accessibleTable, jint row, jint column, AccessibleTableCellInfo *tableCellInfo);
返回有关指定表单元格的信息。行和列说明符从零开始。
BOOL getAccessibleTableRowHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
以表格形式返回指定表格的表格行标题。
BOOL getAccessibleTableColumnHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
将指定表的表列标题作为表返回。
AccessibleContext getAccessibleTableRowDescription(long vmID, AccessibleContext acParent, jint row);
返回指定表中指定行的描述。行说明符从零开始。
AccessibleContext getAccessibleTableColumnDescription(long vmID, AccessibleContext acParent, jint column);
返回指定表中指定列的描述。列说明符从零开始。
jint getAccessibleTableRowSelectionCount(long vmID, AccessibleTable table);
返回表中选择的行数。
BOOL isAccessibleTableRowSelected(long vmID, AccessibleTable table, jint row);
如果选择了指定的从零开始的行,则返回true。
BOOL getAccessibleTableRowSelections(long vmID, AccessibleTable table, jint count, jint *selections);
返回所选行的从零开始的索引数组。
jint getAccessibleTableColumnSelectionCount(long vmID, AccessibleTable table);
返回表中选择的列数。
BOOL isAccessibleTableColumnSelected(long vmID, AccessibleTable table, jint column);
如果选择了指定的从零开始的列,则返回true。
BOOL getAccessibleTableColumnSelections(long vmID, AccessibleTable table, jint count, jint *selections);
返回所选列的从零开始的索引数组。
jint getAccessibleTableRow(long vmID, AccessibleTable table, jint index);
返回指定单元格索引处的单元格的行号。值从零开始。
jint getAccessibleTableColumn(long vmID, AccessibleTable table, jint index);
返回指定单元格索引处的单元格的列号。值从零开始。
jint getAccessibleTableIndex(long vmID, AccessibleTable table, jint row, jint column);
返回表中指定行和列偏移量的索引。值从零开始。
可访问关系集功能BOOL getAccessibleRelationSet(long vmID, AccessibleContext accessibleContext, AccessibleRelationSetInfo *relationSetInfo);
返回有关对象相关对象的信息。
可访问的超文本功能BOOL getAccessibleHypertext(long vmID, AccessibleContext accessibleContext, AccessibleHypertextInfo *hypertextInfo);
返回与组件关联的超文本信息。
BOOL activateAccessibleHyperlink(long vmID, AccessibleContext accessibleContext, AccessibleHyperlink accessibleHyperlink);
请求激活超链接。
jint getAccessibleHyperlinkCount(const long vmID, const AccessibleHypertext hypertext);
返回组件中的超链接数。映射到AccessibleHypertext.getLinkCount 。错误返回-1。
BOOL getAccessibleHypertextExt(const long vmID, const AccessibleContext accessibleContext, const jint nStartIndex, AccessibleHypertextInfo *hypertextInfo);
遍历组件中的超链接。返回从超链接索引nStartIndex开始的组件的超文本信息。对于每次对此方法的调用, 最多返回MAX_HYPERLINKS个 AccessibleHypertextInfo对象。错误返回FALSE 。
jint getAccessibleHypertextLinkIndex(const long vmID, const AccessibleHypertext hypertext, const jint nIndex);
将索引返回到与文档中的字符索引关联的超链接数组中。映射到AccessibleHypertext.getLinkIndex 。错误返回-1。
BOOL getAccessibleHyperlink(const long vmID, const AccessibleHypertext hypertext, const jint nIndex, AccessibleHypertextInfo *hyperlinkInfo);
返回文档中的第n个超链接。映射到AccessibleHypertext.getLink 。错误返回FALSE 。
无障碍键绑定功能BOOL getAccessibleKeyBindings(long vmID, AccessibleContext accessibleContext, AccessibleKeyBindings *keyBindings);
返回与组件关联的键绑定的列表。
无障碍图标功能BOOL getAccessibleIcons(long vmID, AccessibleContext accessibleContext, AccessibleIcons *icons);
返回与组件关联的图标列表。
辅助功能BOOL getAccessibleActions(long vmID, AccessibleContext accessibleContext, AccessibleActions *actions);
返回组件可以执行的操作的列表。
BOOL doAccessibleActions(long vmID, AccessibleContext accessibleContext, AccessibleActionsToDo *actionsToDo, jint *failure);
请求组件执行AccessibleAction的列表。如果执行所有操作,则返回TRUE 。当第一个请求的操作失败时返回FALSE ,在这种情况下,“失败”包含失败的操作的索引。
实用功能BOOL IsSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
返回两个对象引用是否引用同一对象。
AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role);
返回具有指定角色的AccessibleContext ,该角色是给定对象的祖先。角色是Java Access Bridge API数据结构中定义的角色字符串之一。如果没有具有指定角色的祖先对象,则返回(AccessibleContext)0 。
AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role);
返回具有指定角色的AccessibleContext ,该角色是给定对象的祖先。角色是Java Access Bridge API数据结构中定义的角色字符串之一。如果具有指定角色的对象不存在,则返回Java窗口的顶级对象。错误返回(AccessibleContext)0 。
AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext);
返回Java窗口中顶级对象的AccessibleContext 。这是从该窗口的GetAccessibleContextFromHWND获得的AccessibleContext 。错误返回(AccessibleContext)0 。
int getObjectDepth (const long vmID, const AccessibleContext accessibleContext);
返回给定对象在对象层次结构中的深度。对象层次结构中最顶层的对象的对象深度为0。错误返回-1。
AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext);
返回对象当前ActiveDescendent的AccessibleContext 。此方法假定ActiveDescendent是当前在容器对象中选择的组件。错误或没有选择时返回(AccessibleContext)0 。
BOOL requestFocus(const long vmID, const AccessibleContext accessibleContext);
请求关注组件。返回是否成功。
int getVisibleChildrenCount(const long vmID, const AccessibleContext accessibleContext);
返回组件的可见子级数。错误返回-1。
BOOL getVisibleChildren(const long vmID, const AccessibleContext accessibleContext, const int startIndex, VisibleChildrenInfo *visibleChildrenInfo);
获取AccessibleContext的可见子级。返回是否成功。
int getEventsWaiting();
获取等待触发的事件数。
可访问值功能这些功能得到AccessibleValue
Java Accessibility API提供的信息。一个AccessibleContext
对象有AccessibleValue
如果标志包含在其中的信息accessibleValue
在里面AccessibleContextInfo
数据结构设置为TRUE
。返回的值是strings (char *value)
因为无法提前告知该值是整数,浮点值还是其他子类来继承Java语言构造的对象java.lang.Number
。
BOOL GetCurrentAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
BOOL GetMaximumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_ *value, short len);
BOOL GetMinimumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_ *value, short len);
辅助选择功能
这些功能获取并操纵AccessibleSelection
Java Accessibility API提供的信息。一个AccessibleContext
拥有AccessibleSelection
如果标志包含在其中的信息accessibleSelection
在里面AccessibleContextInfo
数据结构设置为TRUE
。的AccessibleSelection
支持是通过添加和删除选择项来操作用户界面(而不是查询)的第一个地方。一些功能使用子坐标中的索引,而其他功能则使用选择坐标。例如,添加以通过传递子索引将其从选择中删除(例如,将第四个子添加到选择中)。另一方面,枚举所选子代是在选择坐标中完成的(例如,获得AccessibleContext
选择的第一个对象)。
void AddAccessibleSelectionFromContext(long vmID, AccessibleSelection
as, int i);
void ClearAccessibleSelectionFromContext(long vmID, AccessibleSelection
as);
jobject GetAccessibleSelectionFromContext(long vmID, AccessibleSelection
as, int i);
int GetAccessibleSelectionCountFromContext(long vmID, AccessibleSelection
as);
BOOL IsAccessibleChildSelectedFromContext(long vmID, AccessibleSelection
as, int i);
void RemoveAccessibleSelectionFromContext(long vmID, AccessibleSelection
as, int i);
void SelectAllAccessibleSelectionFromContext(long vmID, AccessibleSelection
as);
Java Access Bridge API数据结构
Java Access Bridge API数据结构包含在文件中AccessBridgePackages.h
。
重要数据结构
该文件中有一些数据结构是您不需要(可以忽略)的。它们被用作两个Java Access Bridge DLL的进程间通信机制的一部分。重要的数据结构如下:
#define MAX_STRING_SIZE 1024
#define SHORT_STRING_SIZE 256
typedef struct AccessibleContextInfoTag {
wchar_ name[MAX_STRING_SIZE]; // the AccessibleName of the object
wchar_ description[MAX_STRING_SIZE]; // the AccessibleDescription of the object
wchar_ role[SHORT_STRING_SIZE]; // localized AccesibleRole string
wchar_ states[SHORT_STRING_SIZE]; // localized AccesibleStateSet string
// (comma separated)
jint indexInParent // index of object in parent
jint childrenCount // # of children, if any
jint x; // screen x-axis co-ordinate in pixels
jint y; // screen y-axis co-ordinate in pixels
jint width; // pixel width of object
jint height; // pixel height of object
BOOL accessibleComponent; // flags for various additional
BOOL accessibleAction; // Java Accessibility interfaces
BOOL accessibleSelection; // FALSE if this object doesn't
BOOL accessibleText; // implement the additional interface
BOOL accessibleInterfaces; // new bitfield containing additional
// interface flags
} AccessibleContextInfo;
typedef struct AccessibleTextInfoTag {
jint charCount; // # of characters in this text object
jint caretIndex; // index of caret
jint indexAtPoint; // index at the passsed in point
} AccessibleTextInfo;
typedef struct AccessibleTextItemsInfoTag {
wchar_t letter;
wchar_t word[SHORT_STRING_SIZE];
wchar_t sentence[MAX_STRING_SIZE];
} AccessibleTextItemsInfo;
typedef struct AccessibleTextSelectionInfoTag {
jint selectionStartIndex;
jint selectionEndIndex;
wchar_t selectedText[MAX_STRING_SIZE];
} AccessibleTextSelectionInfo;
typedef struct AccessibleTextRectInfoTag {
jint x; // bounding recttangle of char at index, x-axis co-ordinate
jint y; // y-axis co-ordinate
jint width; // bounding rectangle width
jint height; // bounding rectangle height
} AccessibleTextRectInfo;
typedef struct AccessibleTextAttributesInfoTag {
BOOL bold;
BOOL italic;
BOOL underline;
BOOL strikethrough;
BOOL superscript;
BOOL subscript;
wchar_t backgroundColor[SHORT_STRING_SIZE];
wchar_t foregroundColor[SHORT_STRING_SIZE];
wchar_t fontFamily[SHORT_STRING_SIZE];
jint fontSize;
jint alignment;
jint bidiLevel;
jfloat firstLineIndent;
jfloat leftIndent;
jfloat rightIndent;
jfloat lineSpacing;
jfloat spaceAbove;
jfloat spaceBelow;
wchar_t fullAttributesString[MAX_STRING_SIZE];
} AccessibleTextAttributesInfo;
typedef struct AccessibleTableInfoTag {
JOBJECT64 caption; // AccesibleContext
JOBJECT64 summary; // AccessibleContext
jint rowCount;
jint columnCount;
JOBJECT64 accessibleContext;
JOBJECT64 accessibleTable;
} AccessibleTableInfo;
typedef struct AccessibleTableCellInfoTag {
JOBJECT64 accessibleContext;
jint index;
jint row;
jint column;
jint rowExtent;
jint columnExtent;
jboolean isSelected;
} AccessibleTableCellInfo;
typedef struct AccessibleRelationSetInfoTag {
jint relationCount;
AccessibleRelationInfo relations[MAX_RELATIONS];
} AccessibleRelationSetInfo;
typedef struct AccessibleRelationInfoTag {
wchar_t key[SHORT_STRING_SIZE];
jint targetCount;
JOBJECT64 targets[MAX_RELATION_TARGETS]; // AccessibleContexts
} AccessibleRelationInfo;
typedef struct AccessibleHypertextInfoTag {
jint linkCount; // number of hyperlinks
AccessibleHyperlinkInfo links[MAX_HYPERLINKS]; // the hyperlinks
JOBJECT64 accessibleHypertext; // AccessibleHypertext object
} AccessibleHypertextInfo;
typedef struct AccessibleHyperlinkInfoTag {
wchar_t text[SHORT_STRING_SIZE]; // the hyperlink text
jint startIndex; // index in the hypertext document where the link begins
jint endIndex; // index in the hypertext document where the link ends
JOBJECT64 accessibleHyperlink; // AccessibleHyperlink object
} AccessibleHyperlinkInfo;
typedef struct AccessibleKeyBindingsTag {
int keyBindingsCount; // number of key bindings
AccessibleKeyBindingInfo keyBindingInfo[MAX_KEY_BINDINGS];
} AccessibleKeyBindings;
typedef struct AccessibleKeyBindingInfoTag {
jchar character; // the key character
jint modifiers; // the key modifiers
} AccessibleKeyBindingInfo;
typedef struct AccessibleIconsTag {
jint iconsCount; // number of icons
AccessibleIconInfo iconInfo[MAX_ICON_INFO]; // the icons
} AccessibleIcons;
typedef struct AccessibleIconInfoTag {
wchar_t description[SHORT_STRING_SIZE]; // icon description
jint height; // icon height
jint width; // icon width
} AccessibleIconInfo;
typedef struct AccessibleActionsTag {
jint actionsCount; // number of actions
AccessibleActionInfo actionInfo[MAX_ACTION_INFO]; // the action information
} AccessibleActions;
typedef struct AccessibleActionInfoTag {
wchar_t name[SHORT_STRING_SIZE]; // action name
} AccessibleActionInfo;
typedef struct AccessibleActionsToDoTag {
jint actionsCount; // number of actions to do
AccessibleActionInfo actions[MAX_ACTIONS_TO_DO]; // the accessible actions to do
} AccessibleActionsToDo;
typedef struct VisibleChildenInfoTag {
int returnedChildrenCount; // number of children returned
AccessibleContext children[MAX_VISIBLE_CHILDREN]; // the visible children
} VisibleChildenInfo;
Java Access Bridge API回调
Java Access Bridge API回调包含在文件中AccessBridgeCallbacks.h
。您的事件处理功能必须与这些原型匹配。
您必须调用该函数ReleaseJavaObject
在每个JOBJECT64
完成这些事件处理程序后,将返回这些事件处理程序,以防止JVM中的内存泄漏。
如果您使用的是旧版API,请定义ACCESSBRIDGE_ARCH_LEGACY
。
JOBJECT64
被定义为jlong
在64位系统上jobject
在Java Access Bridge的旧版本上。有关定义,请参见ACCESSBRIDGE_ARCH_LEGACY
在里面AccessBridgePackages.h
头文件。
typedef void (*AccessBridge_FocusGainedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_FocusLostFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_CaretUpdateFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MouseClickedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MouseEnteredFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MouseExitedFP) (long vmID, JOBJECT64
event, JOBJECT64 source);
typedef void (*AccessBridge_MousePressedFP)
(long vmID, JOBJECT64 event, JOBJECT64 source);
typedef
void (*AccessBridge_MouseReleasedFP) (long vmID, JOBJECT64 event,
JOBJECT64 source);
typedef void (*AccessBridge_MenuCanceledFP)
(long vmID, JOBJECT64 event, JOBJECT64 source);
typedef
void (*AccessBridge_MenuDeselectedFP) (long vmID, JOBJECT64 event,
JOBJECT64 source);
typedef void (*AccessBridge_MenuSelectedFP)
(long vmID, JOBJECT64 event, JOBJECT64 source);
typedef
void (*AccessBridge_PopupMenuCanceledFP) (long vmID JOBJECT64 event,
JOBJECT64 source);
typedef void (*AccessBridge_PopupMenuWillBecomeInvisibleFP)
(long vmID, JOBJECT64 event, JOBJECT64 source);
typedef
void (*AccessBridge_PopupMenuWillBecomeVisibleFP) (long vmID, JOBJECT64
event, JOBJECT64 source);
typedef void (*AccessBridge_PropertyNameChangeFP)
(long vmID, JOBJECT64 event, JOBJECT64 source, wchar_t *oldName, wchar_t
*newName);
typedef void (*AccessBridge_PropertyDescriptionChangeFP)
(long vmID, JOBJECT64 event, JOBJECT64 source, wchar_t *oldDescription,
wchar_t *newDescription);
typedef void (*AccessBridge_PropertyStateChangeFP)
(long vmID, JOBJECT64 event, JOBJECT64 source, wchar_t *oldState,
wchar_t *newState);
typedef void (*AccessBridge_PropertyValueChangeFP)
(long vmID, JOBJECT64 event, JOBJECT64 source, wchar_t *oldValue,
wchar_t *newValue);
typedef void (*AccessBridge_PropertySelectionChangeFP)
(long vmID, JOBJECT64 event, JOBJECT64 source);
typedef
void (*AccessBridge_PropertyTextChangeFP) (long vmID, JOBJECT64 event,
JOBJECT64 source);
typedef void (*AccessBridge_PropertyCaretChangeFP)
(long vmID, JOBJECT64 event, JOBJECT64 source, int oldPosition, int
newPosition);
typedef void (*AccessBridge_PropertyVisibleDataChangeFP)
(long vmID, JOBJECT64 event, JOBJECT64 source);
typedef
void (*AccessBridge_PropertyChildChangeFP) (long vmID, JOBJECT64 event,
JOBJECT64 source, JOBJECT64 oldChild, JOBJECT64 newChild);
typedef void (*AccessBridge_PropertyActiveDescendentChangeFP)
(long vmID, JOBJECT64 event, JOBJECT64 source, JOBJECT64 oldActiveDescendent,
JOBJECT64 newActiveDescendent);
对Java Access Bridge进行故障排除
本主题为那些为Java Access Bridge开发辅助技术应用程序的人介绍了已知的问题和使用技巧。
已知问题
重新注册菜单事件会生成重复的副本 :如果注册菜单事件,请先注销它,然后再次注册,然后Java Access Bridge会生成该菜单事件的重复副本。
MenuDeselected
关闭菜单时生成的事件 :您没有收到MenuCanceled (或PopupMenuCanceled )事件。要确定菜单已关闭,请查找MenuDeselected事件。
使用技巧
确定菜单项选择中的更改 :使用状态PropertyChange
事件来确定菜单项选择的更改(例如,当用户使用箭头按钮或键在菜单中向上或向下移动时)。
跟踪GUI元素的值 :使用AccessibleValue
支持与价值PropertyChange
事件以跟踪GUI元素(如滑块和滚动条)的值。
确定所选项目 :使用AccessibleSelection
支持确定在包含列表和表格等项目的容器中选择了哪些项目。这比枚举所有孩子并检查他们的孩子更有效。 StateSet
属性以查看所选值是否在其中。
Java Access Bridge测试工具 :Java Access Bridge测试工具jaccessinspector和jaccesswalker位于Java中bin
目录。
的javax.accessibility
程序包提供以下属性: assistive_technologies
和screen_magnifier_present
。
的assistive_technologies
属性指定要加载到JVM中的辅助技术。它以逗号分隔的服务提供商名称列表。请参阅javax.accessibility软件包javax.accessibility。AccessibilityProvider抽象类,以及java.awt。Toolkit.getDefaultToolkit方法。
指示屏幕放大镜的存在
当。。。的时候screen_magnifier_present
属性设置为true
,它使Java平台库知道系统上存在屏幕放大器。应用程序开发人员可以检查此属性,并且如果存在屏幕放大镜,则开发人员应确保其应用程序与屏幕放大率兼容。例如,在Microsoft Windows操作系统上,Java 2D API的参考实现会检查此属性,如果为true,则关闭Microsoft DirectDraw以避免屏幕放大镜出现问题。(某些屏幕放大镜可能无法放大DirectDraw图形。)
设定属性
使用以下命令在运行时设置属性:
java -Djavax.accessibility.assistive_technologies=ServiceProviderName
ServiceProvicerName
是添加辅助技术功能的服务提供商的名称;请参阅javax.accessibility。AccessibilityProvider.getName方法。
您还可以在名为的文件中指定属性.accessibility.properties
在用户的主目录或名为accessibility.properties
在里面$JAVA_HOME/conf
目录。在前一种情况下,属性用于当前用户,在后一种情况下,属性用于该Java安装的所有用户。为当前用户设置的属性优先于为Java安装设置的属性。
在中设置属性accessibility.properties
通过添加一行或多行,如下所示:
assistive_technologies=ServiceProviderName
screen_magnifier_present=true
注意:
您可以在assistive_technologies
属性,并以逗号分隔列表。
为了提供对Java应用程序的访问,辅助技术需要的不只是Java Accessibility API。它还需要支持查找实现Java Accessibility API的用户界面(UI)对象,将辅助技术支持加载到JVM中以及跟踪事件。Java Accessibility Utilities提供了此帮助。
包com.sun.java.accessibility.util中包含的Java Accessibility Utilities为辅助技术提供了必要的支持,以在JVM中运行的Java应用程序中查找和查询UI对象。它还提供了将事件侦听器安装到这些对象中的支持。这些事件侦听器使UI对象可以使用委托事件模型定义的对等方法来了解其他UI对象中发生的特定事件。该程序包由以下主要部分组成:
- 有关Java应用程序的关键信息
- 自动加载辅助技术
- 活动支持
有关Java应用程序的关键信息
com.sun.java.accessibility.util软件包包含用于检索有关在JVM中运行的Java应用程序的关键信息的方法。此支持提供了所有Java应用程序的顶级窗口的列表;当顶级窗口出现(和消失)时通知事件监听器体系结构;用于定位具有输入焦点的窗口,定位鼠标位置以及将事件插入系统事件队列的装置。
自动加载辅助技术
为了使辅助技术能够与Java应用程序一起使用,请将其加载到与其提供访问权限的Java应用程序相同的JVM中。这是通过使用assistive_technologies
属性;请参阅加载辅助技术 。此支持位于EventQueueMonitor类中。
活动支持
Java Accessibility Utilities包括三个类,用于监视Java虚拟机中的事件。第一类AWTEventMonitor ,提供了一种方法来监视JVM中运行的所有AWT组件中的所有AWT事件。此类实际上提供了对AWT事件的系统范围监视,在支持该侦听器类型的每个AWT组件上为每种AWT事件类型注册了一个单独的侦听器。因此,辅助技术可以向AWTEventMonitor注册“焦点侦听器”,这将依次向JVM中每个Java应用程序中的每个AWT组件注册“焦点侦听器”。那些单独的侦听器会将他们听到的事件集中到首先将侦听器注册到AWTEventMonitor的辅助技术中。因此,每当组件获得焦点或失去焦点时(例如,用户按下Tab键),都会通知辅助技术。
第二类SwingEventMonitor扩展了AWTEventMonitor,以提供额外的支持来监视Swing组件支持的Swing事件。由于SwingEventMonitor扩展了AWTEventMonitor ,因此,如果您在辅助技术中使用SwingEventMonitor ,则无需同时使用这两个类。
第三类AccessibilityEventMonitor ,为Accessible对象上的属性更改事件提供支持。当辅助技术使用AccessibilityEventMonitor请求通知Accessible属性更改事件时, AccessibilityEventMonitor将自动在所有组件上注册Accessible属性更改侦听器。此外,它将检测何时在组件层次结构中添加和删除组件,并相应地添加和删除属性更改侦听器。当任何组件中的Accessible属性发生更改时, AccessibilityEventMonitor都会通知辅助技术。