java - 在 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
函数和MessageBox
C# 的函数做类似的事情。通常,当弹出这样的消息对话框时,我的盲文显示器聚焦在确定或关闭按钮上,屏幕阅读器会宣布对话框标题和消息,我还可以通过我的盲文显示器键和/使用滚动来感知对话框的静态文本或触摸光标 (JAWS) 和/或屏幕阅读器的相应特殊光标,如 JAWS 光标或 NVDA 光标,这是鼠标指针,可以在整个屏幕上移动,因此显然最终会落在静态文本上。
但是在 Java 中会发生什么?
- 在 JAWS 下,将打开一个测试对话框。我没有看到任何消息,只有对话框标题,如果我使用触摸光标,我还会看到一个关闭按钮。
- 在 NVDA 下,它与 JAW 下相同,只是焦点不会自动移动,而且我看不到关闭按钮。
- 讲述人也会自动移动焦点,但就像 NVDA 不会感知关闭按钮一样。
我使用 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 确实是可访问的,至少是基类。这并不奇怪,因为它尽可能使用本机小部件 - 仍然很高兴知道。
解决方案
请注意:此答案尚未完成。本质上,我仍然需要去 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# 中的可访问性实现。查看代码片段以了解实现的各种可访问性方面(尽管如果标签不直接位于文本字段的左侧,您只需要专门设置标签和文本字段的关系)。
我希望到目前为止这是有帮助的,我会继续研究。
推荐阅读
- java - Discord bot 成功部署在 Heroku 上但无法连接到 MongoDB
- jestjs - Material-UI 自定义主题调色板属性在 Jest 中产生“未定义”错误
- r - 查找重复的值组
- vue.js - 如何在 vuejs 中使用 axios 显示获取的数据到 div
- python - 如何为表中的选择行反转cmap
- java - 对简单链表进行排序
- reactjs - 拖放行为在 useGesture 上
- module - 如何使用 terraform 在模块功能中制作模块?
- javascript - 循环通过json文件创建html并使用javascript输出html(使用fetch)
- python - Kubernetes pod 在前几次尝试中无法连接到 timescaledb