Доступность Java прямо в Windows
Фон
Я юридически слепоглухой разработчик на С#, Java, PHP, JavaScript и некоторых других языках и библиотеках. Я считаю себя довольно продвинутым разработчиком хобби и скоро начну изучать компьютерные науки.
Я знаю, что мы сосредоточимся на Java как на языке программирования, поэтому я решил взять некоторые из моих старых проектов. Консольные приложения больше не привлекают меня - я там многое сделал. Поэтому я обычно заканчиваю тем, что создаю GUI. Используя PHP и HTML, это очень просто, и в С# тоже не сложно. Конечно, мне нужна помощь с визуальными аспектами; но я могу получить солидный графический интерфейс и работать на Windows, используя С# как в WindowsForms, так и в WPF Framework. Доступность там редко была проблемой.
По иронии судьбы, Java была моей первой попыткой создания графического интерфейса и единственным языком, на котором я никогда не работал должным образом.
Моя проблема
Оставим это простым: все, что я хочу сделать, - это создать диалоговое окно основного сообщения с именем 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
и MessageBox
в С# делают похожие вещи. Обычно, когда появляется такое диалоговое окно с сообщением, мой дисплей Брайля фокусируется на кнопке ОК или Закрыть, программа чтения с экрана объявляет заголовок и сообщение диалога, и я также могу воспринимать статический текст диалога, используя прокрутку с помощью клавиш дисплея Брайля и/или сенсорный курсор (JAWS) и/или соответствующие специальные курсоры программы чтения с экрана, такие как курсор JAWS или курсор NVDA, который является указателем мыши и может перемещаться по всему экрану, поэтому, очевидно, в конечном итоге он попадает на статический текст.
Но что происходит в Java?
- Под JAWS открывается Тестовый диалог. Я не вижу сообщения, только заголовок диалога, и если я использую сенсорный курсор, я также вижу кнопку Закрыть.
- В NVDA он такой же, как в JAW, за исключением того, что фокус не перемещается автоматически, и я не вижу кнопку закрытия.
- Диктор также автоматически перемещает фокус, но точно так же, как NVDA не видит кнопку закрытия.
Я использую Java SDK 11, последнюю версию Eclipse, и Windows 10; NVDA версия 18.3 и последняя версия JAWS 19. Мое программное обеспечение достаточно современное, и, по крайней мере, в JAWS я опытный пользователь, который знает большинство, если не все, методы для получения статического текста.
Ни один из этих методов не сработал.
Вопрос
Кто-нибудь знает, как работает доступность Java? Я знаю, что существуют доступные Java-приложения; Я просто понятия не имею, как их создать. Моя проблема с диалоговыми окнами - просто самая основная из проблем - более сложные графические интерфейсы с JFrames, кнопками, текстовыми полями и т.д. Так же недоступны. И это, хотя Oracle в основном говорит
если вы оставите наши компоненты в покое и, возможно, дадите им доступные имена и описания, они будут доступны сразу после установки.
Любой вклад, который может объяснить, что я пропускаю, был бы очень признателен.
Дальнейшие исследования
javax.swing
Я установил NetBeans на свой компьютер. Нет, если быть точным, я установил установщик NetBeans на свой компьютер. Установщик... недоступен. Само по себе это не является необычным - удивительно, что многие разработчики, которые много думают о создании доступного приложения, затем создают недоступные установщики. Поэтому я придерживаюсь ZIP и ручной настройки так часто, как могу (вы знаете, не все было хуже в 2000-х годах, и я на самом деле рад, что есть пуристы и/или уродцы управления, которые презирают установщиков).
Но действительно интересная вещь: установщик NetBeans выглядит так же, как мои недоступные диалоги и другие графические интерфейсы, которые я создал с помощью javax.swing. То есть: пустое (кроме названия диалога/окна) для NVDA и Narrator, а с помощью JAWS я могу дополнительно обнаружить контекстное меню и кнопку закрытия, если я использую сенсорный курсор. Ура, у меня есть целая кнопка entire для взаимодействия! - Просто он даже не реагирует на то, что я щелкаю по нему клавишей ввода или пробел (не пробовал щелкать мышью, так как я не могу найти эту кнопку закрытия, используя курсор JAWS (он же мышь)).
Я буду продолжать исследования. Но если этот установщик написан в javax.swing, и если NetBeans также написан в javax.swing, то он не выглядит хорошим для общей доступности javax.swing (для слепых). Также я постараюсь связаться с Oracle. В конце концов, должна быть веская причина, по которой они добавили "доступность по умолчанию" в свой документ о javax.swing и предложили провести тестирование с NVDA. Конечно, я просто упускаю очевидную доступность, которую они реализовали - в конце концов, я использовал программы чтения с экрана только двенадцать лет.
PS. Извините за сарказм, но эта ситуация одинаково забавляет и расстраивает меня. В конце концов, компания говорит, что их классы GUI доступны по умолчанию, и мой опыт глухонемых пользователей и разработчиков говорит мне, что это не так.
Стандартный набор инструментов для виджетов (SWT)
Как и предлагалось в комментариях (спасибо, VGR), SWT действительно доступен, по крайней мере, для базовых классов. Это не удивительно, учитывая, что он использует нативные виджеты, когда это возможно, но все же, это полезно знать
Ответы
Ответ 1
Обратите внимание: Этот ответ еще не завершен. По сути, мне все еще нужно пойти в Oracle и поговорить с ними о javax.swing. Тем не менее, я хочу добавить это как частичный ответ/альтернативу колебаниям, поэтому любой, кто занимается этим, получает указание на работающее решение.
Недавно я создал свое первое полностью доступное приложение с графическим интерфейсом на Java. Он использует SWT и бесперебойно работает с точки зрения доступности для Windows (протестировано с NVDA, JAWS и Narrator). Поскольку этот вопрос конкретно относится к Windows, это все, что нам нужно знать. Однако я протестирую приложение на Mac OS и GNU/Linux, если у меня когда-нибудь появится такая возможность, и я добавлю соответствующую информацию.
Принимая во внимание, что SWT использует собственные компоненты и поведение доступности, я подозреваю, что не будет никаких проблем со стандартными компонентами в любой ОС. Но как насчет пользовательских компонентов?
Они тоже ведут себя неплохо. Единственное исключение, которое я нашел, - это CCombo - для пользователей с дисплеем Брайля оно отображается как "текстовое поле", если вы используете JAWS. Как считают NVDA и Рассказчик правильно, и даже JAWS ведет себя как-то правильно, хотя, я полагаю, JAWS - наш виновник, а не SWT.
Как насчет JFace?
Поскольку JFace в основном является расширением SWT, я подозреваю, что это должно быть хорошо с точки зрения доступности, но еще не проверял это. Если вы создаете приложения JFace, найдите время, чтобы протестировать его на наличие проблем с помощью NVDA или хотя бы Narrator.
Любой совет, который Microsoft дает для обеспечения доступности приложений на С#, также применим к SWT, хотя синтаксис для выполнения определенных действий совершенно иной и иногда напоминает ARIA на веб-страницах больше, чем реализация специальных возможностей в С#. Посмотрите на фрагменты кода, чтобы увидеть, как реализуются различные аспекты доступности (хотя вам нужно только специально установить связь между надписью и текстовым полем, если метка не находится непосредственно над текстовым полем).
Я надеюсь, что это пока полезно, и я буду продолжать исследования.
Ответ 2
Я разработчик, который в настоящее время работает над приложениями с графическим интерфейсом в JAVA. Я рекомендую вам использовать JFX для создания приложений с графическим интерфейсом в JAVA, поскольку он был улучшен по сравнению со стандартными Swing, AWT и SWT.
Он должен был заменить Swing. Также я бы порекомендовал вам включить мост доступа Java, расположенный в вашей среде выполнения JRE, чтобы проверить доступность окон, созданных с помощью Swing, AWT или SWT.
Попробуйте включить вот так
Чтобы включить Java Access Bridge, выполните следующую команду (где% JRE_HOME% - это каталог вашей JRE):
% JRE_HOME%\bin\jabswitch -enable
Кроме того, в Windows Vista и более поздних версиях вы можете включить Java Access Bridge через панель управления:
Зайдите в Пуск → Панель управления → Удобство доступа → Простота центра доступа.
Выберите "Использовать компьютер без дисплея".
В разделе Другие установленные программы установите флажок Включить Java Access Bridge.
Просто проверьте это и дайте мне знать, если это ответит на ваш вопрос.