Dieser Artikel ist eine detaillierte Anleitung zur Plattformunabhängigkeit mit Java Swing. Sie lernen wie Sie barrierefreie Software entwickeln, die in den Betriebssystemen Windows, Ubuntu und MacOS eingesetzt werden kann.
Die Testsoftware
Um die Plattformunabhängigkeit in der Programmierung mit Java Swing testen zu können, habe ich eine Java Swing-Anwendung entwickelt, die Java-Swing und JavaFX-Dateien überprüft ob diese screenreadertauglich sind.
Entwicklungsumgebung und virtual Machine
Java entwickle ich am liebsten mit der Entwicklungsumgebung Eclipse. Um meine Software auf mehrere Betriebssysteme testen zu können, habe ich mir eine virtuelle Machine installiert. Ich bin vor einem Jahr von VMWare auf Oracle VM VirtualBox umgestiegen. VirtualBox ist kostenlos und benötigt nicht soviel Resourcen wie VMWare.
Was bedeutet Plattformunabhängigkeit in der Softwareentwicklung?
Plattformunabhängige Softwareentwicklung bzw. Plattformunabhängigkeit in der Softwareentwicklung bedeutet, dass eine Software auf mehrere Betriebssysteme einsetzbar ist. Im konkreten Fall habe ich eine Java Swing Anwendung entwickelt in Windows 10, die auch in Ubuntu 20.04 und MacOS 10.15 eingesetzt werden kann.
Plattformunabhängigkeit der Programmiersprache Java
Die Plattformunabhängigkeit wird in der Informationstechnik die Eigenschaft genannt, dass ein Programm auf verschiedenen Plattformen oder einfacher ausgedrückt in verschiedenen Betriebssystemen ausgeführt werden kann. Die Programmiersprache Java hat die Eigenschaft der Plattformunabhängigkeit.
Barrierefreie Softwareentwicklung – Was ist das?
Barrierefreie Softwareentwicklung bedeutet, dass eine Software so entwickelt wird, dass sie von allen Menschen, auch von Menschen mit einer Behinderung, bedient werden kann.
Was bedeutet plattformunabhängige, barrierefreie Softwareentwicklung?
Plattformunabhängige, barrierefreie Softwareentwicklung bedeutet, dass eine Software so entwickelt wird, dass sie von allen Menschen, auch von Menschen mit einer Behinderung, bedient werden kann und diese Software auf allen Betriebssystemen, hier Windows 10, Ubuntu 20.04 und MacOS 10.15, eingesetzt werden kann.
Was ist Java Swing?
Swing ist ein GUI-Toolkit für die Programmiersprache Java. Zu diesen Bibliotheken gehören zum Beispiel die Java Accessibility API (JAAPI) die für die barrierefreie Softwareentwicklung benötigt wird. Der designierte Nachfolger von Swing ist das Framework JavaFX, das seit März 2014 im Lieferumfang des Oracle JDK enthalten ist, das aber bisher nicht durch den Java Community Process als offizieller Java-Standard spezifiziert wurde.
Plattformunabhängige Softwareentwicklung mit Java Swing – Eine Anleitung
In diesem Abschnitt gebe ich eine schrittweise Anleitung, wie eine Java-Swing-Programm plattformunabhängig entwickelt werden kann.
Installieren von Java in Windows, Ubuntu und MacOS
Damit ein Java-Programm gestartet werden kann, muß in der Regel nur eine java runtime environment. In Windows 10 habe ich Java 8 Update 281 (64bit) installiert.
In Ubuntu 20.04 habe ich openjdk 14 mit folgenden Terminal-Befehlen installiert:
sudo apt install openjdk-14-jdk
sudo apt-get update
In MacOS muß ein JDK installiert werden. Ich habe wie in Windows 10 Zulu Builds of OpenJDK installiert in MacOS 10.15 .
Das plattformunabhängige Encoding der Java-Datei
Damit eine Java-Datei in Windows, Ubuntu und Mac OS kompiliert und ausgeführt werden kann, muss das richtige Encoding verwendet werden. Meine Testanwendung verwendet das Encoding UTF8.
Plattformunabhängige Pfadangaben
Die Angabe von Verzeichnispfaden ist bei Betriebssystemen unterschiedlich. Deswegen muss bei der Softwareentwicklung darauf geachtet werden, dass die plattformunabhängige Software ihre Pfadangaben dem Betriebssystem anpasst.
Das wird in Java mit dem File.separator gemacht.
Hier ein Codebeispiel:
ausgewaehltedatei = ausgewaehltedatei.replace("\\", File.separator);
Plattformunabhängiges Java-Programm starten
Das starten eines Java-Programmes funktioniert in den Betriebssystemen Windows, Ubuntu und Mac OS gleich. Entweder im Konsolenfenster mit:
java MarlemsJBarrierSoftwareChecker
oder mit Starten einer Jar-Datei. Damit die Jar-Datei startet, muss ein Doppelklick auf die Jar-Datei oder die Desktop-Verknüpfung ausgeführt werden.
In folgendem Video wird plattformunabhängige Softwareentwicklung mit Java Swing im Linux-Betriebssystem Ubuntu erklärt.
In folgendem Video wird plattformunabhängige Softwareentwicklung mit Java Swing im Apple-Betriebssystem MacOS erklärt.
Barrierefreie Softwareentwicklung – Die konkrete Umsetzung
Bevor ich zur Programmierung komme, möchte ich Grundbegriffe der barrierefreie Softwareentwicklung mit Java-Swing klären.
Screenreader – Was ist das?
Ein Screenreader ist eine Software die blinden Menschen den Bildschirminhalt vorliest. Damit eine Programmoberfläche von Screenreadern vorgelesen werden kann, muss diese Programmoberfläche bestimmte Voraussetzungen erfüllen. Dies erkläre ich weiter unten ausführlich.
Der Screenreader in Windows 10 befindet sich in Einstellungen -> Erleichterte Bedienung -> Sprachausgabe .
Der Screenreader in Ubuntu 20.04 befindet sich in Einstellungen -> Zugangshilfen -> Bildschirmleser .
Der Screenreader in MacOS 10.15 befindet sich in Systemeinstellungen -> Bedienungshilfen -> VoiceOver.
Im Betriebssystem Windows nutze ich gerne zum Testen den kostenlosen Screenreader NVDA
Java Accessibility API (JAAPI)
Die Java Accessibility API (JAAPI) ist eine Programmierschnittstelle zwischen Java-Anwendungen und Unterstützungstechnologien für Menschen mit Behinderung, wie zum Beispiel mit einem Screenreader, einer Vergrößerungssoftware oder einem Spracheingabesystem. Diese Schnittstelle ist Teil der Java Foundation Classes und somit Teil der Java-Laufzeitumgebung. Die Java Accessibility API ist in javax.accessibility definiert. Die Hauptklasse in der Java Accessibility API ist die AccessibleContext- Klasse, die die minimalen wesentlichen Informationen bereitstellt, die alle zugänglichen Objekte zurückgeben können müssen. Die Accessible-Schnittstelle enthält nur eine Methode namens getAccessibleContext (). Um ein Objekt der AccessibleContext- Klasse zu instanziieren , ruft eine Anwendung die Methode getAccessibleContext () für ein Objekt auf, das die Accessible-Schnittstelle implementiert. Wenn getAccessibleContext () aufgerufen wird, wird ein Objekt einer Klasse zurückgegeben, die als the bekannt istAccessibleContext- Klasse .
Java Access Bridge
Damit die Kommunikation zwischen Swing-Komponenten und Screenreader funktioniert, wird die die Java Access Bridge benötigt.
Die Java Access Bridge wird mit installiert, wenn Sie eine JRE installieren.
Im Betriebssystem Windows kann die Java Access Bridge im Dosfenster aktiviert und deaktiviert werden:
%JAVA_HOME%\bin\jabswitch -enable
%JAVA_HOME%\bin\jabswitch -disable
Im Betriebssystem MacOS wird keine Java Access Bridge benötigt. Eine Java-Swing-Anwendung wird von VoiceOver, der Screenreader von MacOS vorgelesen.
Screenreadertauglichkeit
Screenreadertauglichkeit bedeutet, dass eine Programmoberfläche von Screenreadern vorgelesen werden kann. Dazu müssen den Bedienelementen der grafischen Benutzeroberfläche Texte hinterlegt werden, welche die Funktion eines Bedienelementes beschreibt. Um einer Programmoberflächen-Komponente einen Text zu zuweisen, welcher den Sinn der Komponente erklärt wird die Methode setAccessibleDescription() verwendet.
HINWEIS: Einige JFC-Komponenten verwenden QuickInfos, um diese Informationen bereitzustellen, auch wenn Sie die AccessibleDescription nicht explizit festlegen eines Objekts. Wenn Ihr Programm Tooltipp-Text verwendet, ist Ihre Aufgabe möglicherweise bereits abgeschlossen.
Geben Sie einen beschreibenden Text für Symbole und andere Grafiken an : Rufen Sie für JLabels- und JButton-Klassen, die nur Bilder enthalten, setAccessibleName () auf, um die AccessibleName- Eigenschaft des Objekts festzulegen.
Anmerkung von Markus Lemcke
Unter Windows 10 und MacOS 10.15 haben die Screenreader NVDA und VoiceOver die Programmoberfläche meiner Testanwendung vorgelesen. Unter Ubuntu 20.04 hat es bis jetzt nicht funktioniert. Wenn ich es herausgefunden habe, wie es geht, wird es nachgereicht!
Tastaturbedienbarkeit
Blinde Menschen können keine Computermaus bedienen. Deswegen ist es wichtig, dass eine Software komplett per Tastatur bedienbar ist. Es ist wichtig, dass jedes Bedienelement einer Java Swing-Anwendung per Tabulatortaste erreichbar ist.
Tastaturfokus
Das Bedienelement, welches den Fokus hat sollte gut sichtbar sein. Meine Lieblingsmethode ist, die Hintergrundfarbe des aktiven Bedienelementes auf Gelb zu setzen.
Festlegen von Mnemonics für Komponenten
Mnemonics sind Tastaturäquivalente für die Aktivierung von Komponenten. Wenn Sie eine Komponente haben, die eine setMnemonic()-Methode unterstützt, setzen Sie die Mnemonik auf eine eindeutige Tastenfolge, um das Objekt zu aktivieren. In einer Swing-Anwendung ist es wichtig, dass Sie immer die Mnemonik für den ersten JMenuBar- Eintrag Ihrer App festlegen , damit ein behinderter Benutzer über die Tastatur dorthin gelangen kann.
Codebeispiel:
JMenuBar menuMain = new JMenuBar(); // Hauptmenü
JMenu menuMarlemsJBarrierSoftwareChecker = new JMenu("Marlems JBarriereSoftwareChecker");
menuMarlemsJBarrierSoftwareChecker.setMnemonic(KeyEvent.VK_J);
menuMain.add(menuMarlemsJBarrierSoftwareChecker);
Folgender Beispielcode setzt die Hintergrundfarbe eines JtextField beim Erhalt des Fokus auf Gelb und beim Verlieren des Fokus aus weis.
Codebeispiel:
tfWebadresse.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
tfWebadresse.setBackground(Color.yellow);
}
@Override
public void focusLost(FocusEvent e) {
tfWebadresse.setBackground(Color.white);
}
});
Festlegen einer Tastenkombination für Menüpunkte
JMenuItem-Komponenten bieten eine setAccelerator () -Methode, mit der Sie eine Tastenkombinationen festlegen können. Mit dieser Tastenkombination kann der Benutzer einen Menüpunkt aktivieren, ohne das Menü durchgehen zu müssen. Für blinde und sehbehinderte Menschen sind Tastenkombinationen sehr hilfreich.
Codebeispiel:
progDateiAnalyse = new JMenuItem("Analyse");
progDateiAnalyse.setAccelerator(KeyStroke.getKeyStroke('A', InputEvent.CTRL_DOWN_MASK)); // Shortcut Strg+A
Komponenten ordnungsgemäß beschriften
Wenn Sie die JLabel-Klasse von Swing verwenden, um eine Beschriftung für eine Komponente bereitzustellen, rufen Sie die setLabelFor () -Methode von JLabel auf, um die Komponente mit ihrer Beschriftung zu verknüpfen. Wenn sowohl die angezeigten Mnemonik- als auch die labelFor- Eigenschaften einer Swing-Komponente festgelegt sind, ruft die Bezeichnung der Komponente die requestFocus () -Methode der durch die labelFor- Eigenschaft angegebenen Komponente auf, wenn die entsprechende Mnemonik aktiviert wird.
Codebeispiel:
tfWebadresse = new JTextField(40);
lblWebadresse.setLabelFor(tfWebadresse);
lblWebadresse.setDisplayedMnemonic('w');
Mit setDisplayedMnemonic() kann ein Tastenkürzel für einen Label festgelegt werden.
Die Kombination setLabelFor und SetDisplayedMnemonic sorgen dafür, dass mit dem Tastenkürzel Alt + w das Eingabefeld Webadresse aktiviert wird.
Einstellungen des Betriebssystems übernehmen
Menschen mit Sehbehinderung können in Betriebssystemen eine große Systemschrift einstellen. Menschen mit einer Farbsehschwäche oder einer sehr starken Sehbehinderung stellen im Betriebssystem einen hohen Farbkontrast ein. Deswegen möchten Sie, dass diese Einstellung auch von der Software übernommen wird, mit der sie arbeiten. Dies funktioniert mit Look and Feel in Java Swing. Der nachstehende Code muss in der Main-Methode stehen.
Codebeispiel:
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
Dieser Java-Code wurde von mir erfolgreich unter Windows 10, Ubuntu 20.04 und MacOS 10.15 getestet.
Barrierefreie Softwareentwicklung mit Java Swing – Testen bzw. überprüfen
Barrierefreiheit bei Software ist so komplex, dass sie nicht vollständig automatisiert getestet werden kann. Um sicher zu gehen, dass eine Java Swing-Software barrierefrei ist, muß die Software aufgrund von Richtlinien überprüft werden.
Mit meiner, in Python entwickelten Software, können Java, C# und Python-Dateien automatisiert auf Barrierefreiheit überprüft werden. Jedoch ist auch meine Software nicht perfekt und kann Ihnen eine Überprüfung anhand der Richtlinien nicht ersparen.
Quellen
Hier möchte ich meinen Quellen für diesen Artikel angeben:
- Oracle – Java Accessibility Overview
- Oracle – How to Support Assistive Technologies (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)
Schlussbemerkung
Plattformunabhängige barrierefreie Softwareentwicklung mit Java Swing ist möglich und macht Spaß.
Wenn Sie fragen zu obige Themen haben Schreiben Sie mir eine Mail an info@marlem-software.de oder rufen Sie mich an unter 07072/1278463 .