Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Использование Других Функций Swing
Как к Support Assistive Technologies
Домашняя страница > Создание GUI С JFC/Swing > Использование Других Функций Swing

Как к Support Assistive Technologies

Вы могли бы задаваться вопросом, что точно вспомогательные технологии, и почему следует заботиться. Прежде всего вспомогательные технологии существуют, чтобы позволить людям с постоянной или временной нетрудоспособностью использовать компьютер. Например, если Вы заболели синдромом канала запястья, можно использовать вспомогательные технологии, чтобы выполнить Вашу работу, не используя Ваши руки.

Вспомогательные технологии — речевые интерфейсы, средства чтения с экрана, альтернативные устройства ввода данных, и так далее — полезны не только для инвалидов, но также и для людей, использующих компьютеры в неофисных средах. Например, если Вы застреваете в пробке, Вы могли бы использовать вспомогательные технологии, чтобы проверить Вашу электронную почту, используя только речевой ввод и вывод. Информация, которая включает вспомогательным технологиям, может использоваться для других инструментов, также, таких как автоматизированные тестеры GUI и устройства ввода данных, такие как сенсорные экраны. Вспомогательные технологии получают информацию от компонентов, используя API Доступности, который определяется в javax.accessibility пакет.

Поскольку поддержка API Доступности встраивается в компоненты Swing, Ваша программа Swing будет, вероятно, работать просто великолепно со вспомогательными технологиями, даже если Вы не сделаете ничего специального. Например, вспомогательные технологии могут автоматически получить текстовую информацию, которая устанавливается следующими строками кода:

JButton button = new JButton("I'm a Swing button!");
label = new JLabel(labelPrefix + "0    ");
label.setText(labelPrefix + numClicks);
JFrame frame = new JFrame("SwingApplication");

Вспомогательные технологии могут также захватить текст подсказки (если любой) связанный с компонентом, и используйте его, чтобы описать компонент пользователю.

Создание Вашей функции программы гладко со вспомогательными технологиями легко сделать и, в Соединенных Штатах, может требоваться федеральным законом. Для получения дополнительной информации см. Глобальные Юридические Ресурсы для IT Связанные Проблемы Доступности.

Остальная часть этого раздела затрагивает эти темы:

Правила для Поддержки Доступности

Вот несколько вещей, которые можно сделать, чтобы заставить Вашу программу работать так же как возможный со вспомогательными технологиями:

Тестирование на Доступность

Примеры, которые идут с утилитами доступности, могут дать Вам общее представление о том, насколько доступный Ваша программа. Для получения инструкций по получению этих утилит см. Java Настольная домашняя страница Доступности SE. Следуйте инструкциям в документации утилит доступности для того, чтобы установить виртуальную машину Java (VM), чтобы работать один или больше утилит автоматически.

Давайте использовать утилиту доступности, чтобы сравнить оригинальную версию одного из наших демонстрационных примеров к версии, в которой были применены правила для того, чтобы поддерживать доступность. Вот изображение вызванной программы ScrollDemo.

Снимок исходного, недоступного ScrollDemo.

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать ScrollDemo Сеть Java™ использования Запускается (загрузите JDK 6 или позже). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.

    Запускает пример ScrollDemo
  2. Затем, нажмите кнопку Launch, чтобы работать AccessibleScrollDemo Сеть Java™ использования Запускается (загрузите JDK 6 или позже). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример AccessibleScrollDemo
  3. Сравните эти две версии рядом. Единственное заметное различие - то, что у выключателя см и фотографии есть подсказки в доступной версии.

  4. Теперь выполните эти две версии под утилитой доступности под названием Обезьяна. Отметьте что, когда инструменты доступности были загружены и сконфигурированы в accessibility.properties файл, окно Обезьяны автоматически подходит, когда Вы щелкаете по Выполнению ScrollDemo и ссылки AccessibleScrollDemo (в шагах 1 и 2).

    Если окно Обезьяны не появляется на запуске, проблема может состоять в том что accessibility.properties файл не присутствует в версии VM, который Запускает быть используемым Сетью Java. Можно изменить VM, который Вы используете, выполняя Сеть Java, Запускают Администратор приложений и Файл выбора> Предпочтение> Java.

  5. Отметьте, что, когда окно Обезьяны подходит, Вы должны выбрать Файл> Деревья Обновления, чтобы видеть, что информация появляется под Accessible Tree. Можно тогда развернуть дерево, последовательно щелкая по горизонтальным значкам, выведенным на экран каждым значком папки. Когда дерево было расширено, можно видеть подробную информацию для различных компонентов. Пользовательские компоненты (правила и углы), которые не были доступны в оригинальной версии, доступны в измененной версии. Это может иметь настоящее значение для вспомогательных технологий.


Вот снимок работы Обезьяны ScrollDemo:

Обезьяна, работающая на недоступной версии ScrollDemo.

Левая сторона разделенной области показывает фактическую иерархию компонентов для программы. Правая сторона показывает доступные компоненты в иерархии, которая является тем, что интересует нас.

Первая вещь заметить состоит в том что, даже без явной поддержки в ScrollDemo, Обезьяна в состоянии обнаружить большую информацию о различных компонентах в программе. Большинство компонентов и их дочерние элементы появляются в дереве. Однако, имена для большинства компонентов пусты (нуль), который довольно бесполезен. Описания также пусты.

Дальнейшая проблема идет с пользовательскими компонентами программы. Эти две линейки недоступны, таким образом, они не включаются в доступное дерево. Области просмотра, которые содержат линейки, выводятся на экран как вершины, потому что у них нет никаких доступных дочерних элементов. Пользовательские углы также отсутствуют в доступном дереве.

Теперь вот изображение окна Обезьяны для AccessibleScrollDemo:

Обезьяна, работающая на доступной версии ScrollDemo.


Правила теперь перечисляются как дочерние элементы областей просмотра, и углы перечисляются как дочерние элементы области прокрутки. Кроме того у многих из компонентов теперь есть ненулевые имена.

В предыдущем снимке Обезьяны выбирается элемент Заголовка Столбца. Обезьяна выделяет соответствующий компонент в ScrollDemo программа.

Снимок экрана AccessibleScrollDemo.

Когда элемент выбирается, можно использовать меню Panels Обезьяны, чтобы перевести одну в рабочее состояние из четырех различных панелей, которые позволяют Вам взаимодействовать с выбранным компонентом. Выбирая Панели> панель API Доступности переводит панель в рабочее состояние как один показанный в следующем числе. Эта панель выводит на экран информацию, доступную через методы, определенные в AccessibleContext базируйте class и AccessibleComponent интерфейс.

Панель API доступности для Заголовка Столбца.

У обезьяны есть три других панели:

Примеры утилит доступности удобны как инструменты тестирования и могут дать Вам общее представление о том, насколько доступный компоненты в Вашей программе. Однако, даже если Ваши компоненты ведут себя хорошо у Обезьяны или других примеров, они все еще не могли бы быть абсолютно доступными, потому что Обезьяна и другие примеры осуществляют только определенные части API Доступности.

Единственный истинный тест доступности должен выполнить Ваши программы с реальными вспомогательными технологиями, однако, можно счесть следующее свободное и средство чтения с экрана с открытым исходным кодом полезным: Настольный Доступ NonVisual (NVDA).

Определение Доступных Имен и Описаний на Компонентах

Предоставление компонентов Вашей программы доступные имена и описания является одним из самых легких и самых важных шагов в создании Вашей доступной программы. Следующее является полным списком AccessibleScrollDemo конструктор, который создает область прокрутки и пользовательские компоненты, которые она использует. Полужирные операторы дают компонентные имена и описания, которые могут использовать вспомогательные технологии.

public AccessibleScrollDemo() {
    // Get the image to use.
    ImageIcon bee = createImageIcon("images/flyingBee.jpg",
                      "Photograph of a flying bee.");

    // Create the row and column headers.
    columnView = new Rule(Rule.HORIZONTAL, true);
    if (bee != null) {
        columnView.setPreferredWidth(bee.getIconWidth());
    } else {
        columnView.setPreferredWidth(320);
    }
    columnView.getAccessibleContext().setAccessibleName("Column Header");
    columnView.getAccessibleContext().
            setAccessibleDescription("Displays horizontal ruler for " +
                                     "measuring scroll pane client.");
    rowView = new Rule(Rule.VERTICAL, true);
    if (bee != null) {
        rowView.setPreferredHeight(bee.getIconHeight());
    } else {
        rowView.setPreferredHeight(480);
    }
    rowView.getAccessibleContext().setAccessibleName("Row Header");
    rowView.getAccessibleContext().
            setAccessibleDescription("Displays vertical ruler for " +
                                     "measuring scroll pane client.");

    // Create the corners.
    JPanel buttonCorner = new JPanel();
    isMetric = new JToggleButton("cm", true);
    isMetric.setFont(new Font("SansSerif", Font.PLAIN, 11));
    isMetric.setMargin(new Insets(2,2,2,2));
    isMetric.addItemListener(this);
    isMetric.setToolTipText("Toggles rulers' unit of measure " +
                            "between inches and centimeters.");
    buttonCorner.add(isMetric); //Use the default FlowLayout
    buttonCorner.getAccessibleContext().
                 setAccessibleName("Upper Left Corner");

    String desc = "Fills the corner of a scroll pane " +
                  "with color for aesthetic reasons.";
    Corner lowerLeft = new Corner();
    lowerLeft.getAccessibleContext().
              setAccessibleName("Lower Left Corner");
    lowerLeft.getAccessibleContext().setAccessibleDescription(desc);

    Corner upperRight = new Corner();
    upperRight.getAccessibleContext().
               setAccessibleName("Upper Right Corner");
    upperRight.getAccessibleContext().setAccessibleDescription(desc);
    
    // Set up the scroll pane.
    picture = new ScrollablePicture(bee,
                                    columnView.getIncrement());
    picture.setToolTipText(bee.getDescription());
    picture.getAccessibleContext().setAccessibleName(
                                     "Scroll pane client");

    JScrollPane pictureScrollPane = new JScrollPane(picture);
    pictureScrollPane.setPreferredSize(new Dimension(300, 250));
    pictureScrollPane.setViewportBorder(
            BorderFactory.createLineBorder(Color.black));

    pictureScrollPane.setColumnHeaderView(columnView);
    pictureScrollPane.setRowHeaderView(rowView);

    // In theory, to support internationalization you would change
    // UPPER_LEFT_CORNER to UPPER_LEADING_CORNER,
    // LOWER_LEFT_CORNER to LOWER_LEADING_CORNER, and
    // UPPER_RIGHT_CORNER to UPPER_TRAILING_CORNER.  In practice,
    // bug #4467063 makes that impossible (at least in 1.4.0).
    pictureScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
                                buttonCorner);
    pictureScrollPane.setCorner(JScrollPane.LOWER_LEFT_CORNER,
                                lowerLeft);
    pictureScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER,
                                upperRight);

    // Put it in this panel.
    setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
    add(pictureScrollPane);
    setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}

Часто, программа определяет имя компонента и описание непосредственно через доступный контекст компонента. Другие времена, программа устанавливает доступное описание косвенно с подсказками. В случае выключателя см описание устанавливается автоматически в текст на кнопке.

Понятия: Как Доступность Работает

Объект доступен, если он реализует Accessible интерфейс. Accessible интерфейс определяет только один метод, getAccessibleContext, который возвращается AccessibleContext объект. AccessibleContext объект является посредником, который содержит доступную информацию для доступного объекта. Следующие данные показывают, как вспомогательные технологии получают доступный контекст от доступного объекта и запрашивают его для информации:

Как вспомогательные технологии получают информацию от доступных объектов.

AccessibleContext абстрактный class, который определяет минимальный набор информации, которую доступный объект должен предоставить о себе. Минимальный набор включает имя, описание, роль, набор состояния, и так далее. Чтобы идентифицировать его доступный объект как наличие определенных возможностей, доступный контекст может реализовать один или больше интерфейсов как показано в Доступной таблице Интерфейсов. Например, JButton реализации AccessibleAction, AccessibleValue, AccessibleText, и AccessibleExtendedComponent. Это не необходимо для JButton реализовывать AccessibleIcon потому что это реализуется ImageIcon присоединенный к кнопке.

Поскольку JComponent САМ class не реализует Accessible интерфейс, экземпляры его прямых подклассов не доступны. Если Вы пишете пользовательский компонент, который наследовался непосредственно от JComponent, Вы должны явно заставить это реализовать Accessible интерфейс. JComponent действительно имеет доступный контекст, вызванный AccessibleJComponent, это реализует AccessibleComponent взаимодействуйте через интерфейс и обеспечивает минимальное количество доступной информации. Можно обеспечить доступный контекст для своих пользовательских компонентов, создавая подкласс AccessibleJComponent и переопределение важных методов. Создание Пользовательских Компонентов Доступные шоу два примера выполнения этого.

Все другие стандартные компоненты Swing реализуют Accessible соедините интерфейсом и имейте доступный контекст, который реализует один или больше предыдущих интерфейсов как соответствующий. Доступные контексты для компонентов Swing реализуются как внутренние классы и имеют имена этого стиля:

Component.AccessibleComponent

Если Вы создаете подкласс стандартного компонента Swing, и Ваш подкласс существенно отличается от своего суперкласса, то следует обеспечить пользовательский доступный контекст для этого. Самый легкий путь состоит в том, чтобы создать подкласс доступного контекста суперкласса class и методы переопределения по мере необходимости. Например, если Вы создаете a JLabel разделите на подклассы существенно отличающийся от JLabel, тогда Ваш JLabel подкласс должен содержать внутренний class, который расширяется AccessibleJLabel. Следующий раздел показывает, как сделать так, используя примеры в который JComponent подклассы расширяются AccessibleJComponent.

Создание Пользовательских Доступных Компонентов

Программа демонстрационного примера прокрутки использует три пользовательских компонентных класса. ScrollablePicture подкласс JLabel, и Corner и Rule оба подклассы JComponent.

ScrollablePicture class полагается полностью на доступность, наследованную от JLabel через JLabel.AccessibleJLabel. Код, который создает экземпляр ScrollablePicture устанавливает текст подсказки для изображения с возможностью прокрутки. Текст подсказки используется контекстом в качестве доступного описания компонента. Этим поведением обеспечивают AccessibleJLabel.

Доступная версия Corner class содержит как раз достаточно кода, чтобы сделать его экземпляры доступными. Мы реализовывали поддержку доступности, добавляя код, показанный полужирным оригинальной версии Corner.

public class Corner extends JComponent implements Accessible {

    protected void paintComponent(Graphics g) {
        //Fill me with dirty brown/orange.
        g.setColor(new Color(230, 163, 4));
        g.fillRect(0, 0, getWidth(), getHeight());
    }

    public AccessibleContext getAccessibleContext() {
        if (accessibleContext == null) {
            accessibleContext = new AccessibleCorner();
        }
        return accessibleContext;
    }

    protected class AccessibleCorner extends AccessibleJComponent {
        //Inherit everything, override nothing.
    }
}

Вся доступность, обеспеченная этим class, наследована от AccessibleJComponent. Этот подход прекрасен для Corner потому что AccessibleJComponent обеспечивает разумное количество информации о доступности значения по умолчанию и потому что углы являются неинтересными: они существуют только, чтобы привести в рабочее состояние немного экранного пространства. Другие классы, такой как Rule, потребность предоставить настроенную информацию.

Rule обеспечивает доступный контекст для себя тем же самым способом как Corner, но контекст переопределяет два метода, чтобы обеспечить детали о роли компонента и состоянии:

protected class AccessibleRuler extends AccessibleJComponent {

    public AccessibleRole getAccessibleRole() {
        return AccessibleRuleRole.RULER;
    }

    public AccessibleStateSet getAccessibleStateSet() {
        AccessibleStateSet states =
            super.getAccessibleStateSet();
        if (orientation == VERTICAL) {
            states.add(AccessibleState.VERTICAL);
        } else {
            states.add(AccessibleState.HORIZONTAL);
        }
        if (isMetric) {
            states.add(AccessibleRulerState.CENTIMETERS);
        } else {
            states.add(AccessibleRulerState.INCHES);
        }
        return states;
    }
}

AccessibleRole перечисление объектов, которые идентифицируют роли, которые могут играть компоненты Swing. Это содержит предопределенные роли, такие как метка, кнопка, и так далее. Линейки в нашем примере не соответствуют хорошо ни одной из предопределенных ролей, таким образом, программа изобретает новый в подклассе AccessibleRole:

class AccessibleRuleRole extends AccessibleRole {
    public static final AccessibleRuleRole RULER
        = new AccessibleRuleRole("ruler");

    protected AccessibleRuleRole(String key) {
        super(key);
    }

    //Should really provide localizable versions of these names.
    public String toDisplayString(String resourceBundleName,
                                  Locale locale) {
        return key;
    }
}

Любой компонент, у которого есть состояние, может предоставить информацию о состоянии вспомогательным технологиям, переопределяя getAccessibleStateSet метод. У правила есть два набора состояний: ее ориентация может быть или вертикалью или горизонталью, и ее единицы измерения могут быть или сантиметрами или дюймами. AccessibleState перечисление предопределенных состояний. Эта программа использует свои предопределенные состояния для горизонтальной ориентации и вертикали. Поскольку AccessibleState ничего не содержит для сантиметров и дюймов, программа делает подкласс, чтобы обеспечить соответствующие состояния:

class AccessibleRulerState extends AccessibleState {
    public static final AccessibleRulerState INCHES
        = new AccessibleRulerState("inches");
    public static final AccessibleRulerState CENTIMETERS
        = new AccessibleRulerState("centimeters");

    protected AccessibleRulerState(String key) {
        super(key);
    }

    //Should really provide localizable versions of these names.
    public String toDisplayString(String resourceBundleName,
                                  Locale locale) {
        return key;
    }
}

Вы видели, как реализовать доступность для двух простых компонентов, которые существуют только, чтобы нарисовать себя экранными. Компоненты, которые делают больше, такие как отвечание на мышь или события клавиатуры, должны обеспечить более тщательно продуманные доступные контексты. Можно найти примеры реализации доступных контекстов, копаясь в исходном коде для компонентов Swing.

API Доступности

Таблицы в этом разделе покрывают только часть API доступности. Для получения дополнительной информации о API доступности, см. документацию API для классов и пакетов в пакете доступности. Кроме того, сошлитесь на документацию API для доступных контекстов для отдельных компонентов Swing.

API для того, чтобы поддерживать доступность попадает в следующие категории:

Именование и Соединение Компонентов
Метод Цель
getAccessibleContext ().setAccessibleName (Строка)
getAccessibleContext ().setAccessibleDescription (Строка)
(на a JComponent или Accessible объект)
Обеспечьте имя или описание для доступного объекта.
освободите setToolTipText (Строка)
(в JComponent)
Установите подсказку компонента. Если Вы не устанавливаете описание, чем много доступных контекстов используют текст подсказки в качестве доступного описания.
освободите setLabelFor (Компонент)
(в JLabel)
Свяжите метку с компонентом. Это говорит вспомогательным технологиям, что метка описывает другой компонент.
освободите setDescription (Строка)
(в ImageIcon)
Обеспечьте описание для значка изображения.


Создание Пользовательского Доступного Компонента
Интерфейс или Класс Цель
Доступный
(интерфейс)
Компоненты, которые реализуют этот интерфейс, доступны. Подклассы JComponent должен реализовать это явно.
AccessibleContext
JComponent. AccessibleJComponent
(абстрактный class и его подклассы)
AccessibleContext определяет минимальный набор информации, запрошенной доступных объектов. Доступный контекст для каждого компонента Swing является подклассом этого и названный как показано. Например, доступный контекст для JTree JTree.AccessibleJTree. Чтобы обеспечить пользовательские доступные контексты, пользовательские компоненты должны содержать внутренний class, который является подклассом AccessibleContext. Для получения дополнительной информации см. Делающие Пользовательские Доступные Компоненты.
AccessibleRole
AccessibleStateSet
(классы)
Определите объекты, возвращенные AccessibleContext объект getAccessibleRole и getAccessibleStateSet методы, соответственно.
AccessibleRelation
AccessibleRelationSet
(классы, представленные в 1.3)
Определите отношения между компонентами, которые реализуют этот интерфейс и один или более других объектов.


Доступные Интерфейсы
Интерфейс Цель
AccessibleAction Указывает, что объект может выполнить действия. Реализовывая этот интерфейс, доступный контекст может дать информацию о том, какие действия доступный объект может выполнить и может сказать доступному объекту выполнить их.
AccessibleComponent Указывает, что у доступного объекта есть экранное присутствие. Через этот интерфейс доступный объект может предоставить информацию о своем размере, позиции, видимость и так далее. Доступные контексты для всех стандартных компонентов Swing реализуют этот интерфейс, прямо или косвенно. Доступные контексты для Ваших пользовательских компонентов должны сделать то же самое. С 1.4, AccessibleExtendedComponent предпочитается.
AccessibleEditableText
(Представленный в 1.4)
Указывает, что доступный объект выводит на экран доступный для редактирования текст. В дополнение к информации, доступной от ее суперинтерфейса, AccessibleText, методы обеспечиваются для того, чтобы они сократили, вставили, удалили, выбрали, и вставили текст.
AccessibleExtendedComponent
(Представленный в 1.4)
В дополнение к информации, доступной от ее суперинтерфейса, AccessibleComponent, методы обеспечиваются для того, чтобы они получили привязки клавиш, текст границы, и текст подсказки.
AccessibleExtendedTable
(Представленный в 1.4)
В дополнение к информации, доступной от ее суперинтерфейса, AccessibleTable, методы обеспечиваются, чтобы преобразовать между индексированием и его строкой или столбцом.
AccessibleHypertext Указывает, что доступный объект содержит гиперссылки. Через этот интерфейс доступный объект может предоставить информацию о своих ссылках и позволить им быть пересеченными.
AccessibleIcon
(Представленный в 1.3)
Указывает, что у доступного объекта есть связанный значок. Методы то, при условии, что информация о возврате о значке, таком как размер и описание.
AccessibleKeyBinding
(Представленный в 1.4)
Указывает, что доступный объект поддерживает одно или более сочетаний клавиш, которые могут использоваться, чтобы выбрать объект. Методы то, при условии, что возврат привязки клавиш для данного объекта.
AccessibleSelection Указывает, что доступный объект может содержать выбор. Доступные контексты, которые реализуют этот интерфейс, могут сообщить информацию о текущем выборе и могут изменить выбор.
AccessibleTable
(Представленный в 1.3)
Указывает, что доступный объект представляет данные в двумерном объекте данных. Через эту информацию об интерфейсе о таблице, такой как табличный заголовок, обеспечиваются строка и размер столбца, описание, и имя. С 1.4, AccessibleExtendedTable предпочитается.
AccessibleText Указывает, что доступный объект выводит на экран текст. Этот интерфейс обеспечивает методы для того, чтобы они возвратили все или часть текста, атрибуты применялись к этому, и другая информация о тексте, таком как его длина.
AccessibleValue Указывает, что у объекта есть числовое значение. Через этот интерфейс доступный объект предоставляет информацию о своей текущей стоимости и своих минимальных и максимальных значениях.

Примеры, который Использование API Доступности

Следующая таблица приводит некоторые из наших примеров, у которых есть хорошая поддержка вспомогательных технологий.

Пример Где Описано Примечания
AccessibleScrollDemo Этот раздел Содержит два пользовательских компонента, которые реализуют Accessible интерфейс. Видеть, что менее доступная версия этой программы видит, Как Использовать Области прокрутки.
ButtonDemo Как Использовать Общий API Кнопки Использование три кнопки. Поддерживает доступность через текст кнопки, мнемонику, и подсказки.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Таймеры Swing
Следующая страница: Как Использовать Подсистему Фокуса