我是使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
这不是火箭科学。JavaScript的alert
功能和MessageBox
C#的功能相似。通常,当这样的消息对话框弹出时,我的盲文显示集中在“确定”或“关闭”按钮上,屏幕阅读器会宣布对话框标题和消息,并且我还可以通过盲文显示键和/滚动来感知对话框的静态文本。或触摸光标(JAWS)和/或屏幕阅读器的各个特殊光标(例如JAWS光标或NVDA光标),它们是鼠标指针,可以在整个屏幕上移动,因此显然最终会落在静态文本上。
但是在Java中会发生什么呢?
我使用Java SDK 11,最新的Eclipse版本和Windows 10。NVDA版本18.3和最新的JAWS 19版本。我的软件是最新的,至少在JAWS中,我是一个专家用户,他了解大多数(如果不是全部)获取静态文本的方法。这些方法均无效。
有谁碰巧知道Java可访问性如何工作?我知道存在可访问的Java应用程序。我只是不知道如何创建它们。我的对话框问题只是最基本的问题-无法访问带有JFrame,按钮,文本字段等的更复杂的GUI。而且,尽管Oracle基本上会说,只要您不理会我们的组件,并给出可访问的名称和描述,便可以立即使用它们。
任何可能解释我所缺少的内容的输入将不胜感激。
我在计算机上安装了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类,而我作为聋哑用户和开发人员的经验告诉我,它们不是。
正如注释中所建议的(感谢VGR),SWT确实是可访问的,至少是基类。考虑到它尽可能使用本机窗口小部件,这不足为奇。
iOS 上的 VoiceOver 是我遇到的唯一一个似乎无法element.focus()
正确处理锚点和 JavaScript功能的屏幕阅读器。
查看我的博客。在那里你会看到经典的skip to content
-link 和一个scroll to top
-button。该链接是一个常规锚点,其目标是具有 id 的 div main
。该按钮会触发动画,但由于这对盲人没有理想的效果,我还让它将焦点移到了skip to content
链接上。在 VoiceOver 开启时双击上述任一控件。焦点不会移动。我在 Safari、Firefox、Google Chrome 和 iSource 的 iOS 应用程序中对此进行了测试。
现在转到任何其他设备,无论是 android 手机还是 windows 计算机。打开屏幕阅读器。据我所知,它始终有效(使用 Microsoft Edge、Google Chrome 和 Internet Explorer 进行测试)。
锚点的 HTML:
<a href="#main" id="top-link">Skip to content</a>
<!-- ... -->
<div id="main" role="main">
<!-- ... -->
</div>
Run Code Online (Sandbox Code Playgroud)
按钮的 JS: document.getElementById('scroll-to-top').addEventListener('click', function() { document.getElementById('top-link').focus(); }); …
我有以下要求:
在我的网页上有用于导航的锚链接(像skip to content
等)。这些锚点应该将目标元素带入视野并聚焦它。(焦点很重要,因为否则屏幕阅读器无法正确定位。到目前为止,我的代码如下所示:
<a href="#content" class="navbtn">Skip to content</a>
<!-- somewhere else...-->
<div id="content" tabindex="-1">
Lorem ipsum...
</div>
<script>
$(".navbtn").click(function(e) {
e.preventDefault();
$("#content").focus();
});
</script>
Run Code Online (Sandbox Code Playgroud)
请注意,我知道这是硬编码的,将来我会更改它,但出于测试目的,我将其留在这里。
好的,这有什么作用呢? 在这篇文章中 ,上面的方法被称为聚焦 div 元素。视觉上我无法判断,但我的屏幕阅读器不会移动到元素(我在 iPhone 上的 Safari 中使用 VoiceOver)。如果目标是按钮、链接或任何其他默认具有 tabindex 的元素,则它可以正常工作。
有任何想法吗?
编辑:按左模式键时,我让它与盲文显示器一起工作。我通常使用正确的模式键向手机发送双击事件,但正确的不起作用。然而,左边的人确实如此。我不知道为什么,说实话。在屏幕上双击仍然不起作用...无论哪种方式,都不需要 JavaScript。
我有以下代码:
string result = "";
for(int i=2; i<=excelRange.Rows.Count; i++)
{
result += excelRange.Cells[i, 2].Value2;
}
Run Code Online (Sandbox Code Playgroud)
对于包含数百个条目的 Excel 文件,这需要 5 秒钟。也许有更有效的方法吗?我只想要从 B2 到 Bn 的值。