首页 > 解决方案 > 在 Windows 上直接获得 Java 可访问性

问题描述

的背景

我是 C#、Java、PHP、JavaScript 和其他一些语言和库的合法盲人开发人员。我认为自己是一个相当高级的爱好开发者,很快就会开始学习计算机科学。
我知道我们将专注于 Java 作为编程语言,因此我决定拿起我的一些旧项目。控制台应用程序对我不再具有真正的吸引力——我在那里做了大部分事情。所以我通常最终会创建 GUI。使用 PHP 和 HTML,这很容易,在 C# 中也不太难。当然,我需要视觉方面的帮助;但我可以在 WindowsForms 和 WPF 框架中使用 C# 在 Windows 上启动并运行可靠的 GUI。可访问性在那里很少成为问题。

具有讽刺意味的是,Java 既是我创建 GUI 的第一次尝试,也是唯一一种我从未让它正常工作的语言。

我的问题

让我们保持简单:我要做的就是创建一个基本的消息对话框,并以Test其中的文本命名Hello world。让我们来看看。

import javax.swing.JOptionPane;

public class GUITest {
  public static void main(String[] args) {
    JOptionPane.showMessageDialog(null, "Hello world!", "Test", JOptionPane.INFORMATION_MESSAGE);
  }
}

这不是火箭科学。JavaScript 的alert函数和MessageBoxC# 的函数做类似的事情。通常,当弹​​出这样的消息对话框时,我的盲文显示器聚焦在确定或关闭按钮上,屏幕阅读器会宣布对话框标题和消息,我还可以通过我的盲文显示器键和/使用滚动来感知对话框的静态文本或触摸光标 (JAWS) 和/或屏幕阅读器的相应特殊光标,如 JAWS 光标或 NVDA 光标,这是鼠标指针,可以在整个屏幕上移动,因此显然最终会落在静态文本上。

但是在 Java 中会发生什么?

我使用 Java SDK 11、最新的 Eclipse 版本和 Windows 10;NVDA 版本 18.3 和最新的 JAWS 19 版本。我的软件是最新的,至少在 JAWS 中我是一个专家用户,知道大多数(如果不是全部)获取静态文本的方法。这些方法都不起作用。

问题

有谁碰巧知道 Java 可访问性是如何工作的?我知道存在可访问的 Java 应用程序;我只是不知道如何创建它们。我的对话框问题只是最基本的问题 - 带有 JFrame、按钮、文本字段等的更复杂的 GUI 也同样无法访问。尽管 Oracle 基本上说,只要您不理会我们的组件,并且可能提供易于访问的名称和描述,它们就可以开箱即用。

任何可能解释我所缺少的输入将不胜感激。

进一步的研究

javax.swing

我在我的计算机上安装了 NetBeans。不,确切地说,我在我的计算机上安装了 NetBeans 的安装程序。安装程序...无法访问。这本身并不罕见 - 令人惊讶的是,许多开发人员在创建可访问的应用程序时花了很多心思,然后创建了不可访问的安装程序。因此,我尽可能多地坚持使用 ZIP 和手动配置(你知道,在 2000 年代并非一切都更糟,我真的很高兴那里有鄙视安装程序的纯粹主义者和/或控制狂)。

但真正有趣的是:NetBeans 安装程序看起来就像我使用 javax.swing 创建的无法访问的对话框和其他 GUI。即:NVDA 和讲述人的空白(对话框/窗口名称除外),并且使用 JAWS,如果我使用触摸光标,我还可以检测上下文菜单和关闭按钮。万岁,我有一个完整的按钮可以与之交互!- 只是它甚至没有响应我用回车键或空格键单击它(没有尝试单击鼠标,因为我无法使用 JAWS 光标(又名鼠标)找到这个关闭按钮)。

我会继续研究。但是如果这个安装程序是用 javax.swing 编写的,并且如果 NetBeans 也是用 javax.swing 编写的,那么它对于 javax.swing 的整体可访问性(对于盲人)来说看起来并不好。另外,我将尝试联系 Oracle。毕竟,他们必须有充分的理由在他们关于 javax.swing 和建议使用 NVDA 测试的文档中添加“默认情况下可访问性”。当然,我只是错过了他们实现的明显可访问性——毕竟,我只使用屏幕阅读器 12 年。

PS。很抱歉讽刺,但这种情况同样让我感到有趣和沮丧。毕竟,一家公司说他们的 GUI 类默认是可以访问的,而我作为聋盲用户和开发人员的经验告诉我他们不是。

标准小部件工具包 (SWT)

正如评论中所建议的(感谢VGR),SWT 确实是可访问的,至少是基类。这并不奇怪,因为它尽可能使用本机小部件 - 仍然很高兴知道。

标签: javawindowsaccessibility

解决方案


请注意:此答案尚未完成。本质上,我仍然需要去 Oracle 并与他们讨论 javax.swing。尽管如此,我想将其添加为摇摆的部分答案/替代方案,因此任何对此进行调查的人都会得到一个可行的解决方案。


我最近用 Java 创建了我的第一个完全可访问的 GUI 应用程序。它使用SWT并且在 Windows 上的可访问性方面表现流畅(使用 NVDA、JAWS 和讲述人测试)。由于这个问题专门针对 Windows,所以我们只需要知道这些。但是,如果有机会,我也会在 Mac OS 和 GNU/Linux 上测试该应用程序,并将添加适当的信息。

考虑到 SWT 使用本机组件和可访问性行为,我怀疑任何操作系统上的标准组件都不会出现任何问题。但是自定义组件呢?
他们的行为也相当不错。我发现的一个例外是 CCombo - 对于盲文显示器用户,如果您使用 JAWS,它会显示为“文本字段”。由于 NVDA 和 Narrator 正确地感知它,甚至 JAWS 的行为也有点正确,不过,我猜 JAWS 是我们的罪魁祸首,而不是 SWT。

JFace呢?

由于 JFace 基本上是 SWT 的扩展,我怀疑它在可访问性方面应该没问题,但还没有检查过。如果您创建 JFace 应用程序,请花时间使用 NVDA 或至少使用讲述人来测试它的可访问性问题。

Microsoft 为使 C# 应用程序可访问性提供的任何建议也适用于 SWT,尽管执行某些操作的语法完全不同,有时更类似于网页上的 ARIA,而不是 C# 中的可访问性实现。查看代码片段以了解实现的各种可访问性方面(尽管如果标签不直接位于文本字段的左侧,您只需要专门设置标签和文本字段的关系)。

我希望到目前为止这是有帮助的,我会继续研究。


推荐阅读