java - 在Windows上直接获取Java可访问性

标签 java windows accessibility

的背景

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

具有讽刺意味的是,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函数和C#的MessageBox做类似的事情。通常,当这样的消息对话框弹出时,我的盲文显示器将焦点放在“确定”或“关闭”按钮上,屏幕阅读器会宣布对话框标题和消息,并且我还可以通过盲文显示键和/滚动来感知对话框的静态文本。或触摸光标(JAWS)和/或屏幕阅读器的各个特殊光标(例如JAWS光标或NVDA光标),它们是鼠标指针,可以在屏幕上移动,因此显然最终落在了静态文本上。

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

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

    问题

    有谁碰巧知道Java可访问性如何工作?我知道存在可访问的Java应用程序。我只是不知道如何创建它们。我的对话框问题只是最基本的问题-带有JFrame,按钮,文本字段等的更复杂的GUI也无法访问。而且尽管甲骨文基本上说
    只要您不理会我们的组件,并且可能给出可访问的名称和描述,即可直接使用它们。

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

    进一步的研究

    javax.swing

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

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

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

    PS。抱歉,这很讽刺,但这种情况同样使我感到震惊和沮丧。毕竟,一家公司表示默认情况下可以访问其GUI类,而我作为聋哑用户和开发人员的经验告诉我,它们不是。

    标准小工具工具包(SWT)

    正如注释中所建议的(感谢VGR),SWT确实是可访问的,至少是基类。考虑到它会尽可能使用 native 窗口小部件,这不足为奇。

    最佳答案

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

    我最近用Java创建了我的第一个完全可访问的GUI应用程序。它使用SWT并在Windows上的可访问性方面运行平稳(已通过NVDA,JAWS和Narrator测试)。正如这个问题专门针对Windows,这就是我们需要知道的全部。但是,如果有机会,我也会在Mac OS和GNU/Linux上测试该应用程序,并将添加适当的信息。

    考虑到SWT使用 native 组件和可访问性行为,我怀疑任何操作系统上的标准组件都不会有任何问题。但是自定义组件呢?
    他们的行为也相当好。我发现的一个异常(exception)是CCombo-对于盲文显示用户,如果使用JAWS,它将显示为“文本字段”。但是,由于NVDA和Narrator正确地理解了它,甚至JAWS的行为都正确,我想JAWS是我们的罪魁祸首,而不是SWT。

    JFace呢?

    由于JFace本质上是SWT的扩展,因此我怀疑它在可访问性方面应该不错,但尚未进行检查。如果创建JFace应用程序,请花时间使用NVDA或至少使用Narrator对它进行可访问性问题测试。

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

    希望到目前为止对我有帮助,我将继续进行研究。

    关于java - 在Windows上直接获取Java可访问性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57574449/

    相关文章:

    ruby-on-rails - 在 Windows 和 Linux/OS X 的 Gemfile 中指定不同的 Ruby 版本(例如 1.9.3 与 2.1)?

    python - 通过Python计算进程cpu使用率

    javascript - 屏幕阅读器 aria 实时断言文本被中断

    c# - 从同一类的不同实例设置 protected /私有(private)属性

    ios - 画外音无法正确读取电话号码

    java - 如何使用 XPages Java 代码在自定义控件中设置输入控件的有效方法?

    java - 如何从底部 fragment 获取数据到主要 Activity ?

    java - File.isDirectory() 对于同一目录返回 true 和 false

    java - C++ JMS 客户端或 C++/C SOAP 客户端

    Java - 在 pom.xml 中添加 jar 依赖