的背景
我是使用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中会发生什么?
我使用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/