直接在 Windows 上获得 Java 可访问性背景我的问题问题进一步研究

2022-09-02 22:44:39

背景

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

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

我的问题

让我们保持简单:我想做的就是创建一个以文本命名的基本消息对话框。让我们来看看它。TestHello world

import javax.swing.JOptionPane;

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

这不是火箭科学;JavaScript的函数和C#的函数做类似的事情。通常,当弹出这样的消息对话框时,我的盲文显示器集中在“确定”或“关闭”按钮上,屏幕阅读器会宣布对话框标题和消息,并且我还可以通过盲文显示键和/或触摸光标(JAWS)和/或屏幕阅读器的相应特殊光标(如JAWS光标或NVDA光标)进行滚动来感知对话框的静态文本, 这是鼠标指针,可以在屏幕上到处移动,所以显然最终会落在静态文本上。alertMessageBox

但是在Java中会发生什么呢?

  • 在 JAWS 下,将打开一个“测试”对话框。我没有看到任何消息,只有对话框标题,如果我使用触摸光标,我还看到一个关闭按钮。
  • 在NVDA下,它与JAWs下相同,只是焦点不会自动移动,我看不到关闭按钮。
  • 讲述人也会自动移动焦点,但就像NVDA不会感知关闭按钮一样。

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

问题

有没有人碰巧知道Java可访问性是如何工作的?我知道存在可访问的Java应用程序;我只是不知道如何创建它们。我对对话框的问题只是最基本的问题 - 更复杂的GUI与JFrame,按钮,文本字段等一样不可访问。尽管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进行测试。当然,我只是错过了他们实现的明显的可访问性 - 毕竟,我只使用屏幕阅读器十二年。

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

标准小部件工具包 (SWT)

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


答案 1

请注意:这个答案还不完整。从本质上讲,我仍然需要去Oracle并与他们讨论javax.swing。尽管如此,我想将此添加为摆动的部分答案/替代方案,因此任何对此进行调查的人都会被指向一个有效的解决方案。


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

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

JFace呢?

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

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

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


答案 2

我是一名开发人员,目前正在开发JAVA中的GUI应用程序。我建议您使用JFX在JAVA中构建GUI应用程序,因为它已经从标准的Swing,AWT和SWT增强。它旨在取代Swing。此外,我建议您启用位于 JRE 运行时环境中的 Java 访问桥,以检查使用 Swing 或 AWT 或 SWT 创建的窗口可访问性。

尝试启用如下要启用 Java 访问桥,请运行以下命令(其中 %JRE_HOME% 是 JRE 的目录):

%JRE_HOME%\bin\jabswitch -enable 或者,在 Windows Vista 及更高版本中,您可以通过“控制面板”启用 Java Access Bridge:

转到“开始”菜单 ->“控制面板>”轻松使用“>”轻松访问中心”。选择“使用不带显示器的计算机”。在“已安装的其他程序”部分中,选中“启用 Java 访问桥”复选框。只需检查一下,如果这回答了您的问题,请告诉我。


推荐