• 如何使用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可访问性API

javax.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。

  1. 单击“ 开始” ,选择“ 控制面板” ,然后选择“ 轻松访问” ,然后选择“ 轻松访问中心” 。或者,按Windows徽标键+ U访问“轻松访问中心”。
  2. 选择“不使用显示器使用计算机” 。
  3. 在“ 安装的其他程序 ”部分中,选中“ 启用Java Access Bridge ”复选框(您可能需要向下滚动)。

禁用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。

  1. 确保已启用Java Access Bridge。
  2. 安装支持Java Access Bridge的辅助技术产品,例如以下产品之一:
    • JAWS

    • NonVisual Desktop Access (NVDA)

    • ZoomText

    • Dolphin ScreenReader

  3. 运行使用以下内容的Java应用程序: javax.accessibility包装并确保您的辅助技术产品可以正常使用。

Java Access Bridge工具

使用jaccessinspectorjaccesswalker这些工具是JRE和JDK的一部分,用于测试Java Access Bridge。

的jaccessinspector该工具使用Java Accessibility Utilities API来检查有关Java虚拟机中对象的可访问信息。的jaccesswalker该工具将遍历特定Java虚拟机中的组件树,并在树视图中显示可访问性层次结构。在JRE或JDK中找到这些工具bin目录。

64位操作系统上辅助技术的最低版本要求

本主题列出了一些用于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应用程序之间启用的通信称为进程间通信

5 Java Access Bridge API

Java Access Bridge API使您能够为与Java应用程序一起使用的Microsoft Windows操作系统开发辅助技术应用程序。它包含本机方法,使您可以查看和操作有关Java应用程序中GUI元素的信息,该信息通过Java Access Bridge转发给您的辅助技术应用程序。

Java Access Bridge API文件

Java Access Bridge API可以在四个文件中找到: AccessBridgeCalls.hAccessBridgeCalls.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);

得到AccessibleContextvmID给定窗口的值。许多Java Access Bridge功能需要AccessibleContextvmID价值观。

事件处理功能

它们采用指向将处理事件类型的函数的函数指针。如果您不再有兴趣接收这些类型的事件,请再次调用该函数,并传入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的核心。

功能GetAccessibleContextAtGetAccessibleContextWithFocus检索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回调描述了它们。

功能GetAccessibleChildFromContextGetAccessibleParentFromContext使您能够遍历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    256typedef struct AccessibleContextInfoTag {wchar_ name[MAX_STRING_SIZE];        // the AccessibleName of the objectwchar_ description[MAX_STRING_SIZE]; // the AccessibleDescription of the objectwchar_ role[SHORT_STRING_SIZE];      // localized AccesibleRole stringwchar_ states[SHORT_STRING_SIZE];    // localized AccesibleStateSet string//   (comma separated)jint indexInParent                   // index of object in parentjint childrenCount                   // # of children, if anyjint x;                              // screen x-axis co-ordinate in pixelsjint y;                              // screen y-axis co-ordinate in pixelsjint width;                          // pixel width of objectjint height;                         // pixel height of objectBOOL accessibleComponent;            // flags for various additionalBOOL accessibleAction;               // Java Accessibility interfacesBOOL accessibleSelection;            // FALSE if this object doesn'tBOOL accessibleText;                 // implement the additional interfaceBOOL accessibleInterfaces;           // new bitfield containing additional//   interface flags
} AccessibleContextInfo;typedef struct AccessibleTextInfoTag {jint charCount;       // # of characters in this text objectjint caretIndex;      // index of caretjint 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-ordinatejint y;          // y-axis co-ordinatejint width;      // bounding rectangle widthjint 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;  // AccesibleContextJOBJECT64 summary;  // AccessibleContextjint 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 hyperlinksAccessibleHyperlinkInfo links[MAX_HYPERLINKS];  // the hyperlinksJOBJECT64 accessibleHypertext;                  // AccessibleHypertext object
} AccessibleHypertextInfo;typedef struct AccessibleHyperlinkInfoTag {wchar_t text[SHORT_STRING_SIZE]; // the hyperlink textjint startIndex;                 // index in the hypertext document where the link beginsjint endIndex;                   // index in the hypertext document where the link endsJOBJECT64 accessibleHyperlink;   // AccessibleHyperlink object
} AccessibleHyperlinkInfo;typedef struct AccessibleKeyBindingsTag {int keyBindingsCount; // number of key bindingsAccessibleKeyBindingInfo keyBindingInfo[MAX_KEY_BINDINGS];
} AccessibleKeyBindings;typedef struct AccessibleKeyBindingInfoTag {jchar character; // the key characterjint modifiers;  // the key modifiers
} AccessibleKeyBindingInfo;typedef struct  AccessibleIconsTag {jint iconsCount;                            // number of iconsAccessibleIconInfo iconInfo[MAX_ICON_INFO]; // the icons
} AccessibleIcons;typedef struct AccessibleIconInfoTag {wchar_t description[SHORT_STRING_SIZE]; // icon descriptionjint height;                            // icon heightjint width;                             // icon width
} AccessibleIconInfo;typedef struct AccessibleActionsTag {jint actionsCount;                                // number of actionsAccessibleActionInfo 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 doAccessibleActionInfo actions[MAX_ACTIONS_TO_DO]; // the accessible actions to do
} AccessibleActionsToDo;typedef struct VisibleChildenInfoTag {int returnedChildrenCount;                        // number of children returnedAccessibleContext 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目录。

6辅助功能属性

javax.accessibility程序包提供以下属性: assistive_technologiesscreen_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属性,并以逗号分隔列表。

7 Java可访问性实用工具概述

为了提供对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都会通知辅助技术。

Java Access Bridge相关推荐

  1. 自动安装 Java Access Bridge 2.0.2 的批处理脚本

    为了方便自己使用,写了一个自动安装 JAB 的批处理脚本,可以自动判断系统版本,判断默认使用的 java 版本. 下载压缩包后,解压,然后点击install.cmd 即可完成安装. 这个批处理脚本只是 ...

  2. java php bridge吧_使用Php-Java Bridge

    我无法正确设置Php-Java Bridge设置. 我会解释我做了什么. >我的网站是纯PHP >对于我们的支付交易流程,我们需要设置一个php-java桥 >我按照此链接设置了桥梁 ...

  3. java access dbq_java连接access数据库

    完整代码: packageodbcj;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedSta ...

  4. java access dbq 参数_Java怎么连接access数据库,要求讲解详细一些

    import java.sql.*; public class ConnectAccess { /** * 初学者请注意: * 1:先建立一个access文件a1.mdb,并放在D:/下; * 2:在 ...

  5. java access dbq_Java-Access汇总

    http://www.doczj.com/doc/3b7b55100b4e767f5acfce38.html/view/d1c01b43a8956bec0975e33e.html 在网上看了一些资料, ...

  6. java access jdbc_Java连接Access数据库

    JDBC(Java DataBase Connectivity)是Java数据库连接API.JDBC能完成与一个数据库建立连接,然后向数据库发送SQL语句,再处理数据库返回的结果. JDBC在设计上和 ...

  7. java access 不在本地_线上的java项目访问不到线上数据库,但是这个数据库我本地可以连接到,求解...

    java.lang.Exception: 数据库连接失败:Cannot create PoolableConnectionFactory (Server connection failure duri ...

  8. java access远程连接_Java程序实现对access数据库的远程访问

    第四步:在其它计算机中运行测试代码 1.  程序中需要数据提供驱动程序,如: Class.forName("org.objectweb.rmijdbc.Driver").newIn ...

  9. java access 2013_jdk1.8环境下的java如何直连接microsoft access2013(都是64位系统也是)...

    展开全部 工具: Access数据库 方法如下:控制面板->系统安全->管理工具->数据源e69da5e887aa3231313335323631343130323136353331 ...

  10. java access 密码_java 连接加密Access2007数据库时,不用输入用户名密码也能连上

    java 连接加密Access2007数据库时,不用输入用户名密码也能连上 我用Access2007做了一个加密的数据库,用的是Access本身的功能加密的.双击打开Database2.mdb文件时, ...

最新文章

  1. MindSpore 高阶优化器
  2. 蓝桥杯 校门外面的树 (线段树,区间处理)
  3. 超详细解读ORB-SLAM3 单目初始化过程(上篇)
  4. ubuntu16.04在英文状态下安装中文语言包的过程(法一:图形界面的方式) 以及 安装中文语言包后无法选择汉语问题的解决
  5. Linux学习之命令【1】
  6. UA STAT687 线性模型理论I 线性模型概述
  7. 修复迁移后Net Standard项目中的错误
  8. 投資效益計算公式4/10
  9. vue 为什么要销毁第三方实例_Web前端工程师面试之Vue问题汇总解析
  10. 35岁是继续做测试,还是回家送外卖?
  11. 60V降压芯片|60V转5V-12伏POE电源芯片
  12. 本周成长记录及跟踪(2019年-11月-第4周)
  13. 异数OS-织梦师-PBFT(六) 走出区块链,加速破解PBFT
  14. Heartbeat介绍
  15. libero-soc许可证申请和环境配置
  16. 1秒生成证件照——小米云证件照微信小程序
  17. 这可能是你们都在找的:React 纯原生纯hook多标签微前端
  18. Xilinx Zynq ZynqMP DNA
  19. NAND驱动分析--(二)
  20. SAP中通过生产版本有效期控制物料生产入库分析测试

热门文章

  1. rtl8211 smi读取_RTL8211E应用(二)之信号输入、输出接口
  2. python鼠标点击脚本_python模拟鼠标点击脚本
  3. 按英语体育计算机创建透视表,2016年职称计算机考试模拟练习题
  4. c语言日历程序实验报告,万年历实验报告.doc
  5. 使用arcface+CrossEntropyLoss处理普通分类
  6. doc 问卷调查模板表_调查问卷模板.doc
  7. 激光能类毕业论文文献都有哪些?
  8. 提升手机麦克风音量_安卓手机音量调整办法(听筒、话筒、扬声器)
  9. hilbert方程组matlab,数值分析(Hilbert矩阵)病态线性方程组的求解Matlab程序
  10. 弱监督学习-snorkel