zurück zum Artikel

Barrierefreie Software mit JavaFX

Markus Lemcke
Barrierefreie Software mit JavaFX

JavaFX ist ein Framework zum Erstellen von Java-Anwendungen, die plattformunabhängig sind. Leider gibt es nur wenig Dokumentation, wie sich mit JavaFX barrierefreie Software entwickeln lässt. Zeit, dass sich das ändert.

In Deutschland leben circa 10 Millionen Menschen mit Behinderung. Davon sind 7,8 Millionen schwerbehindert. Sie alle profitieren davon, wenn Software barrierefrei entwickelt wird. Im Gleichstellungsgesetz für Menschen mit Behinderungen werden in §12 staatliche Einrichtungen zur Barrierefreiheit bei Webseiten, Programmen und Apps verpflichtet. Unternehmen sind das nicht, sollten es aber umsetzen. Die Barrierefreiheit in der Informatik steht selbst in der UN-Behindertenrechtskonvention, ein Übereinkommen über die Rechte von Menschen mit Behinderungen, das 177 Staaten ratifiziert haben.

Zunächst sei die Situation blinder und sehbehinderter Menschen in Bezug auf die Bedienung von Software erklärt. Blinde Menschen arbeiten mit Software, die den Bildschirminhalt vorliest. Die wohl am häufigsten verwendeten Screenreader sind Jaws und NVDA. Jaws ist kostenpflichtig, NVDA lässt sich kostenlos herunterladen. Blinde sind bei der Bedienung von Software darauf angewiesen, dass der Reader vorliest, wie die Softwareoberfläche aufgebaut ist.

Um die Situation blinder Menschen genauer zu erklären, folgendes Beispiel: Ein blinder Computer-Nutzer möchte sich ein neues E-Mail-Programm zulegen. Sein erstes Problem ist, dass es noch immer keine Auszeichnungspflicht gibt, ob eine Software tauglich für einen Screenreader ist oder nicht. Er sucht sich demnach zehn E-Mail-Programme aus, die er testen möchte. Jetzt kann es gut sein, dass von den zehn Programmen nur zwei screenreadertauglich sind. Er hat also acht E-Mail-Programme umsonst installiert. Außerdem ist die Auswahl zwischen zwei E-Mail-Programmen eine erhebliche Einschränkung gegenüber denen, die sehen können. Diese Beeinträchtigung gilt es zu verbessern, in dem es zur Regel werden muss, dass Software screenreadertauglich entwickelt wird.

Bevor JavaFX zur Sprache kommt, sei kurz erklärt, wie mit Java Swing barrierefreie Softwareentwicklung gestaltet wurde, damit erkennbar ist, dass sich mit JavaFX einiges verbessert hat.

Die erste Möglichkeit, mit der Programmiersprache Java barrierefreie Programmoberflächen zu entwickeln, hieß Swing, ein ursprünglich von Sun Microsystems entwickeltes GUI-Toolkit. Seit Java 1.2 ist Swing Bestandteil der Java-Runtime. Damit die Programmoberfläche mit dem Screenreader kommunizieren kann, war eine Java Access Bridge zu installieren und in der "Erleichterten Bedienung" von Windows zu aktivieren. War eine 32-Bit- und eine 64-Bit Java Runtime Environment installiert, mussten Entwickler die Bridge per DOS-Befehl aktivieren, weil sich per Windows-Oberfläche nur eine Bridge aktivieren ließ. Um die Betriebssystemeinstellungen zu übernehmen, war ein bestimmter Code in die Java-Swing-Anwendung zu implementieren.

JavaFX ist der Nachfolger von Swing. Die Kommunikation zwischen JavaFX-Programmoberfläche und Screenreader funktioniert jetzt ohne Java Access Bridge. Um eine JavaFX-Oberfläche screenreadertauglich zu gestalten, müssen Entwickler den Oberflächenkomponenten Texte hinterlegen, welche die Oberflächenkomponente beschreiben. Blinde Nutzer müssen sich das Aussehen der Oberfläche aufgrund der Texte vorstellen können. Um das zu erreichen, müssen Entwickler der Eigenschaft accessibleRoleDescription einen Text zuweisen, der die Funktion einer Programmoberflächenkomponente beschreibt.

searchInputArea.setAccessibleRoleDescription("Bitte Suchbegriff eingeben. Suche starten mit der Enter-Taste");

Wenn das Eingabefeld searchInputArea den Fokus bekommt, liest der Screenreader den Text "Bitte Suchbegriff eingeben. Suche starten mit der Enter-Taste" vor. Damit er weiß, dass searchInputArea ein Eingabefeld ist, müssen Entwickler ihm eine Rolle zuweisen. Das geschieht mit der Eigenschaft AccessibleRole:

searchInputArea.setAccessibleRole(AccessibleRole.TEXT_FIELD);

Wenn die beiden Eigenschaften AccessibleRoleDescription und AccessibleRole gesetzt sind, lässt sich die JavaFX-Anwendung mit einem Screenreader lesen.

Für blinde, aber auch für viele sehbehinderte Menschen ist es unabdingbar, dass eine Software komplett per Tastatur bedienbar ist. Sie wissen nicht, an welcher Position sich der Mauszeiger auf dem Monitor befindet. Deswegen können sie ihn auch nicht an eine bestimmte Position auf dem Monitor bewegen. Das bedeutet, dass blinde Menschen eine Software mit einer Computermaus gar nicht bedienen können.

Deswegen ist es für blinde und viele sehbehinderte Menschen eine Grundvoraussetzung, dass sie eine Software nur per Tastatur nutzen können. Als Erstes ist deswegen zu überprüfen, ob sich per Tabulatortaste jedes Bedienelement erreichen lässt. Danach sollte dafür gesorgt werden, dass die wichtigsten Programmfunktionen und Menüs Tastenkürzel oder Shortcuts besitzen.

Folgendes Codebeispiel zeigt das Erstellen eines Menü-Shortcuts:

Menu editMenu = new GermanModifierMenu("_Bearbeiten");
MenuItem undo = new MenuItem("_Rückgängig");
undo.setAccelerator(new KeyCodeCombination(KeyCode.Z, KeyCombination.CONTROL_DOWN));
editMenu.getItems().add(undo);

Hier wird dem Menü "Rückgängig" der Shortcut Strg + Z zugewiesen.

Beschriftungen von Eingabefeldern sollten immer links vom Eingabefeld sein, weil die Leserichtung auch bei Screenreadern von links nach rechts ist. Damit der Reader weiß, welche Beschriftung zu welchem Eingabefeld gehört, müssen die beiden miteinander verknüpft sein. Das geschieht mit dem Java-Befehl setLabelFor:

Label searchLabel = new Label("_Suchen:");
TextField searchInputArea = new TextField("");
searchLabel.setMnemonicParsing(true);
searchLabel.setLabelFor(searchInputArea);

Hier wird ein Label mit dem Text "Suchen" mit einem Eingabefeld searchInputArea verknüpft. Wenn man nun das Label mit der Tastenkombination Alt + S aktiviert, bekommt das mit setLabelFor verknüpfte Eingabefeld den Eingabefokus.

Es gibt Programmfenster mit vielen Eingabefeldern, etwa eine Eingabemaske zur Adressenverwaltung. In Eingabefeldern wird der Textcursor nur als senkrechter Strich dargestellt. Das ist für Menschen mit starker Sehbehinderung ein Problem. Sie können nicht erkennen, in welchem Eingabefeld sich der Textcursor befindet, weil der senkrechte Strich schlecht zu sehen ist. Um das Problem zu lösen, sollte das aktive Eingabefeld eine andere Hintergrundfarbe bekommen. Hierfür eignet sich die Farbe Gelb.

In JavaFX eine Hintergrundfarbe zu ändern ist nicht einfach. Es werden CSS-Kenntnisse benötigt. Im folgenden Codebeispiel werden zwei Label und zwei Textfelder zur Eingabe von Vor- und Nachname angelegt:

Label vLblVorname = new Label("_Vorname:"); 
TextField vVorname = new TextField("");
Label vLblNachname = new Label("_Nachname:");
TextField vNachNameFeld = new TextField("");

Jetzt folgen die zwei Listener, die dafür sorgen, dass die Eingabefelder "Vorname" und "Nachname" gelb werden, wenn diese aktiv sind:

vVorname.focusedProperty().addListener(new ChangeListener<Boolean>() {    
@Override
public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) {
if (newPropertyValue)
{vVorname.setStyle("-fx-background-color: yellow;" );}
else {vVorname.setStyle("-fx-background-color: white;" );}
}
});

Die setStyle-Angaben sind CSS.

vNachNameFeld.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue,Boolean newPropertyValue) {
if (newPropertyValue)
{vNachNameFeld.setStyle("-fx-background-color: yellow;" );}
else {vNachNameFeld.setStyle("-fx-background-color: white;" );}
}
});

So lässt sich dafür sorgen, dass die Hintergrundfarbe des aktiven Eingabefeldes gelb und somit gut sichtbar für Menschen mit einer Sehbehinderung ist.

Menschen mit Sehbehinderungen oder Farbfehlsichtigkeit können Einstellungen im Betriebssystem vornehmen, die unterstützen, den Computer besser zu bedienen. Damit diese Einstellungen helfen, muss die Java-Anwendung sie übernehmen.

Bei Einstellungen | System | Anzeige | Erweiterte Skalierungseinstellungen | Benutzerdefinierte Skalierung lässt sich eine Prozentangabe eingeben, wie groß die Schrift von Windows sein soll. 150 Prozent ist zum Testen ein guter Wert. Nachdem die Windows-Systemschrift größer ist, startet man die Java-Anwendung. Danach ist zu überprüfen, ob alle Programmfenster lesbar und bedienbar sind. Ist das der Fall, dann können auch Menschen mit einer Sehbehinderung mit der Java-Anwendung arbeiten. Eine wichtige Anmerkung: Ein Programmfenster kann man nicht so gestalten, dass sich die Windows-Systemschrift beliebig groß skalieren lässt.

Große Systemschrift von Windows

Große Systemschrift von Windows

Menschen mit einer Farbenfehlsichtigkeit können einer Farbe nicht immer den richtigen Namen geben. Außerdem wissen sie nicht, welche Farben zusammen passen. Wenn eine Software eine dunkle Hintergrund- und eine dunkle Schriftfarbe hat, ist sie für viele Menschen mit einer Farbenfehlsichtigkeit nicht zu bedienen, weil sie Beschriftungen von Schaltern und Eingabefeldern nicht erkennen können. Deswegen sollten Entwickler bei der Farbgestaltung von Programmfenstern auf einen guten Farbkontrast achten. Eine gute Hilfe hierfür ist das kostenlose Programm Colour Contrast Analyser [1]. Mit ihm lässt sich überprüfen, ob ein Farbkontrast barrierefrei ist oder nicht.

Jetzt gibt es aber ein Problem: Eine JavaFX-Anwendung übernimmt den hohen Kontrast nicht automatisch – einer von mehreren Fehlern bei JavaFX. In der Main-Methode der JavaFX-Anwendung ist deswegen der hohe Kontrast per Java-Code abzufragen und ein hoher Kontrastmodus zu setzen:

public static void main(String[] arguments) {
if (arguments.length == 1) {
startUpPath = arguments[0];
}
// Barrierefreiheit: Abfrage, ob im Betriebssystem Windows hoher Kontrast
// aktiviert ist, wenn ja, wird er übernommen
Toolkit toolkit = Toolkit.getDefaultToolkit();
isHighContrast = (Boolean) toolkit.getDesktopProperty("win.highContrast.on");
if (isHighContrast) {
System.setProperty("com.sun.javafx.highContrastTheme", "whiteOnBlack");
}
launch();
}

Mit diesem Code fragt die Java-Anwendung ab, ob im Betriebssystem ein hoher Kontrast aktiv ist, und wenn ja, dann setzt sie den hohen Kontrast "whiteOnBlack". Der Haken ist, dass sich mit JavaFX nicht abfragen lässt, welcher Kontrastwert im Betriebssystem gesetzt ist. Es kann nur abgefragt werden, ob der hohe Kontrastmodus aktiv ist. Deswegen müssen Entwickler entscheiden, welchen hohen Kontrast ihre JavaFX-Anwendung übernehmen soll. Wie oben erwähnt, findet sich das im Code "whiteOnBlack".

Hoher Kontrast-Modus von Windows

Hoher Kontrast-Modus von Windows

Um testen zu können, ob eine JavaFX-Anwendung in diesem Modus bedienbar ist, stellt man den Kontrast in Windows bei Einstellungen | Erleichterte Bedienung | Hoher Kontrast ein. Danach müssen Entwickler die Java-Anwendung starten und überprüfen, ob der hohe Kontrast übernommen wurde. Als Zweites müssen sie nachschauen, ob trotz hohem Kontrast die Anwendung für Menschen mit Farbfehlsichtigkeit bedienbar ist. Das geht mit dem erwähnten Colour Contrast Analyser. Ist der Farbkontrast zwischen Hintergrund- und Schriftfarbe nicht barrierefrei, dann sind weitere Farbanpassungen erforderlich.

Sind alle aufgeführten Punkte umgesetzt, ist die JavaFX-Anwendung für blinde und sehbehinderte Menschen barrierefrei.

Markus Lemcke [2]
ist Software- und Webentwickler, Dozent sowie Berater in Sachen IT-Barrierefreiheit.
(ane [3])


URL dieses Artikels:
https://www.heise.de/-4434218

Links in diesem Artikel:
[1] https://developer.paciellogroup.com/resources/contrastanalyser/
[2] https://www.marlem-software.de/
[3] mailto:ane@heise.de