可访问性在软件开发中至关重要。尤其是在银行、医疗和教育等领域,可用性会影响到广泛且多样化的用户群体。政府及其他组织也要求软件需对残障人士友好。
然而,许多旧版 Java 桌面应用在可访问性方面存在诸多不足,例如屏幕阅读器支持不完善、键盘导航受限、缺乏高对比度模式等,导致部分用户难以使用。
相比之下,现代浏览器和 Web 库在设计时充分考虑了可访问性,不仅具备内置的可访问性功能,浏览器扩展程序还可以进一步提升可用性。
本文将介绍如何利用 Web 技术来提升 Java 桌面应用程序的可访问性。
Java 应用的可访问性
Java 的 UI 工具包并未忽视可访问性问题。Swing 通过 javax.accessibility
包提供了良好的支持,JavaFX 的 Accessibility API 具备丰富的自定义选项,并兼容各个平台的辅助工具。SWT 采用原生控件,因此具备内置的可访问性功能。
然而,将这些 API 集成到旧代码中往往十分复杂且耗时。许多 Java 应用在开发时,并未将可访问性作为优先考虑的因素。随着时间推移,一些可访问性问题已深深植根于用户体验之中,修复起来困难且成本高昂。
要让 UI 符合现代可访问性标准并不容易。例如,如果您想增加 Swing 中聚焦文本字段的对比度,就需要花费不少精力:
var textField = new JTextField();
var defaultBorder = textField.getBorder();
var focusBorder = new CompoundBorder(
createLineBorder(Color.BLUE, 3),
new EmptyBorder(2, 2, 2, 2)
);
textField.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
textField.setBorder(focusBorder);
}
@Override
public void focusLost(FocusEvent e) {
textField.setBorder(defaultBorder);
}
});
如果将这种改动应用到应用程序的每个组件,可访问性优化很快就会变成一项令人望而生畏的任务。如今,受限于过时的设计、有限的预算,以及可能破坏现有功能的风险,这一挑战变得更加具有挑战性。
Web 中的可访问性
可访问性是 Web 设计的重要组成部分。WCAG(Web 内容无障碍指南)指南概述了 Web 可访问性的四大原则:网站必须是可感知的、可操作的、可理解的和健壮的。现代 Web 框架在设计时已考虑到许多这些要求,减少了额外编码的需求。
浏览器扩展程序在可访问性方面也发挥着重要作用。它们可以弥补现有的不足,并且用户几乎无需额外操作即可受益。常见的示例包括:
- 屏幕阅读器:为视力受损或盲人用户朗读页面内容。
- 阅读优化工具:去除页面干扰元素,提高可读性。
- 颜色对比度调节器:允许用户自定义颜色,提升视觉可见度。
- 焦点增强工具:突出显示当前激活的元素,方便导航。
- 键盘导航工具:支持仅使用键盘进行页面操作。
- 可访问性测试工具:帮助开发者确保符合 WCAG 标准。
通过 JxBrowser 实现可访问性
借助 Web 技术的优势,您可以轻松地提升 Java 应用的可访问性。嵌入式浏览器让您能够将 Java 代码与 Web 界面结合,从而创建一个混合应用。
在本文中,我们将探究 JxBrowser,这是一款颇受欢迎的解决方案,用于将基于 Chromium 的浏览器嵌入到 Swing、JavaFX、SWT 或 Compose Desktop 应用程序中。
将 JxBrowser 添加到项目中
以下是将 JxBrowser 添加到 Gradle 项目的方法:
plugins {
id("com.teamdev.jxbrowser") version "{gradle_plugin_version}"
}
jxbrowser {
version = "{version}"
}
dependencies {
// 为 JxBrowser 与 Swing 集成添加依赖项。
// 还提供了:jxbrowser.swt, jxbrowser.javafx, jxbrowser.compose。
implementation(jxbrowser.swing)
// 为当前平台的 Chromium 二进制文件添加依赖项。
implementation(jxbrowser.currentPlatform)
}
如果您不使用 Gradle,请查看 Maven 快速入门指南。
添加可访问性扩展程序
在 JxBrowser 中,您可以从 CRX 文件或 Chrome 应用商店安装 Chrome 扩展程序。有关如何以编程方式获取 CRX 文件的详细信息,请参考 Chrome 扩展程序指南。
以下是如何使用 CRX 文件通过一行代码安装 High Contrast 扩展程序:
var extension = profile.extensions().install(Paths.get("High Contrast.crx"));
在很多情况下,安装一个扩展程序就足以在网页上看到效果了。不过,有些扩展程序会通过弹出窗口提供可配置的功能。弹出窗口是在点击 Chrome 工具栏中的扩展程序图标时出现的对话框。JxBrowser 允许您通过代码点击扩展程序:
extension.action(browser).ifPresent(ExtensionAction::click);
之后,扩展程序的弹出窗口将在新窗口中打开:
如果我们不想在应用启动时显示这个弹出窗口怎么办?例如,我们可能希望在安装后自动启用高对比度模式。
为了实现这一点,我们可以注册 OpenExtensionActionPopupCallback
来替代默认行为。在这个回调中,我们可以访问弹出窗口及其 HTML 文档。从这里,我们只需要通过 JavaScript 点击相应的单选按钮来选择我们想要的模式。
以下是代码示例:
var javaScript = """
const selector = 'span[i18n-content="highcontrast_increased_contrast"]';
document.querySelector(selector)
?.closest('label')
?.querySelector('input[type="radio"]')
?.click();
""";
browser.set(OpenExtensionActionPopupCallback.class, (params, tell) -> {
// 获取扩展程序的操作弹出窗口。
var popupBrowser = params.popupBrowser();
// 等待文档完全加载。
popupBrowser.navigation().on(FrameDocumentLoadFinished.class, event -> {
var frame = event.frame();
// 通过 JavaScript 点击所需的按钮。
frame.executeJavaScript(javaScript);
});
tell.proceed();
});
当应用启动时,高对比度模式将自动启用。
结论
在本文中,我们讨论了如何通过迁移到 Web 来更轻松地实现良好的可访问性,并且几乎不需要额外的工作。借助 JxBrowser,您可以快速而轻松地使用 Chrome 扩展程序来实现这一目标。