In eigener Sache: BINARIUM eröffnet

Neben meiner Tätigkeit als Java-Autor und Trainer beschäftige ich mich seit fünf Jahren mit dem Aufbau eines Museums für Heimcomputer und Videospielkonsolen. Angefangen habe ich im April 2011 mit dem Aufbau der Sammlung. Heute zählt die Sammlung etwa 800 relevante Objekte.

Nachdem die Sammlung eine hinreichende Größe erreichte, erwarb ich im Juli 2104 eine 2400 qm-Immobilie der ehemaligen Ruhrkohle AG und baute es zu einen Museum, Café/Bistro und Schulungsräumen um. tutego führt die öffentlichen Java-Trainings schon seit über einem Jahr durch, das Gastro NETZWERK ist seit Oktober geöffnet. Mit etwa einem Jahr Verspätung kann es nun auch mit dem Museum im EG losgehen.

Am 8.12.2016 eröffnet das BINARIUM, das Deutsche Museum der digitalen Kultur, in Dortmund Huckarde das Erdgeschoss. Die umfassende Sammlung bietet einen Überblick über die Videospielkonsolen und Geschichte der letzten 40 Jahre. Mehr als 200 Exponate und 20 Spielstationen erwarten euch.

2017 wird die Ausstellung mit persönlichen Computern/Heimcomputern im OG eröffnet.

PlantUML, Styling von Diagrammen

PlantUML ist ein Open Source Projekt, zum Erstellen von UML-Diagrammen in einer textuellen Sprache. Zum Beispiel:

Bob->Alice : hello

Die Heimat des Projektes ist http://plantuml.com/.

Man beschreibt sein grafisches Projekt in dieser Sprache und die Software erzeugt dann das Diagramm. Allerdings ist der Standardstyle weit vom „quasi“-Standard entfernt. Um aber auch User in Genuss dieser Software kommen zu lassen, die grafisch weniger bunte Diagramme vorziehen, bedarf es einiger Anpassungen.

Im Folgenden ein paar Anpassungen, die mit PlantUML ein Diagramm erzeugen, das mehr dem „quasi“ Standard entspricht:

skinparam monochrome true

Entfernt die Farben aus dem Diagramm

skinparam shadowing false

Entfernt den Schlagschatten

skinparam classAttributeIconSize 0

Entfernt die Custom-Icons vor Klassenattributen und Methoden (Nur Klassendiagramm)

skinparam DefaultFontName arial

Legt die Standard-Schriftart fest (Der Name ist hier Systemabhängig)

skinparam DefaultFontSize 12

Legt die Standard-Schriftgröße in Pixeln fest.

skinparam ClassFontStyle bold

Ändert die Schrift im Klassenkopf auf Fettdruck (Nur Klassendiagramm)

hide empty fields

Versteckt leere Felder zB.wenn eine Klasse keine Attribute hat.

hide circle

Versteckt das Icon vor den Klassennamen
Der Effekt:

PlantUML Standard
PlantUML Standard

Anzeige parametrisiert:

PlantUML mit Parametern
PlantUML mit Parametern

Zur Verwendung genannter Befehle

Um die Parameter einzusetzen, genügt es sie in dem Körper des UML-Diagrammtextes, als erstes aufzuführen z. B.:

@startuml
skinparam monochrome true
skinparam shadowing false
skinparam classAttributeIconSize 0
skinparam DefaultFontName arial
skinparam DefaultFontSize 12
skinparam ClassFontStyle bold
hide empty fields
hide circle
...
@enduml

Des Weiteren ist es möglich, wenn man viele Diagramme hat, die man alle gleich gestalten möchte, die Parameter einmalig in einer separaten Datei anzulegen, z. B. style.iuml und diese dann per !include einzubinden. In dieser Datei wird auf @startuml und @enduml verzichtet. Zur Verdeutlichung:

Inhalt der style.iuml:

skinparam monochrome true
skinparam shadowing false
skinparam classAttributeIconSize 0
skinparam DefaultFontName arial
skinparam DefaultFontSize 12
skinparam ClassFontStyle bold
hide empty fields
hide circle

Inhalt einer möglichen UML-Datei

@startuml
!include style.iuml
...
@enduml

Autor: André Fischer

HTML-Datei in eine PDF-Datei mit java-wkhtmltopdf-wrapper

Lösungen, um aus Java heraus eine HTML-Datei eine PDF-Datei zu generieren gibt es einige, allerdings ist die Qualität nicht immer gut. Unter Zuhilfenahme der freien Software wkhtmltopdf auf der Basis der WebKit Rendering Engine gibt es mitunter bessere Ergebnisse. Für wkhtmltopdf gibt es mit java-wkhtmltopdf-wrapper von Jhonny Mertz einen passendem quelloffenen Java-Wrapper.

wkhtmltopdf

Wkhtmltopdf ist eine Open Source Applikation die Headless (ohne jegliche grafische Oberfläche) eine HTML-Datei rendert und als PDF-Datei speichert. Gesteuert wird das Programm über die Kommandozeile im folgenden Format:

$ wkhtmltopdf <<Quell-HTML>> <<Ziel-PDF>>

ein Beispiel zum besseren Verständnis:

$ wkhtmltopdf www.google.com google.pdf

Um erfolgreich aufgerufen zu werden, muss entweder die Kommandozeile im Installationsverzeichnis von wkhtmltopdf befinden oder wkhtmltopdf in den Umgebungsvariablen (PATH) hinzugefügt werden, andernfalls kann die Anwendung nicht gefunden werden.

Des weiteren kann der Applikation eine Vielzahl von Parametern übergeben werden, um das Ergebnis den eigenen Bedürfnissen anzupassen, z. B. mit dem Parameter -s kann man die Größe der PDF-Datei festlegen. Der Standard liegt hier bei DIN A4.

Ein Beispiel für DIN A3 Format:

$ wkhtmltopdf www.google.com google.pdf -s “A3“

Dies ist natürlich nur ein Bruchteil der möglichen Parameter, eine vollständige Liste in Englisch finden Sie hier:

Global Options:

    --collate                       Collate when printing multiple copies
                                      (default)
      --no-collate                    Do not collate when printing multiple
                                      copies
      --cookie-jar <path>             Read and write cookies from and to the
                                      supplied cookie jar file
      --copies <number>               Number of copies to print into the pdf
                                      file (default 1)
  -d, --dpi <dpi>                     Change the dpi explicitly (this has no
                                      effect on X11 based systems)
  -H, --extended-help                 Display more extensive help, detailing
                                      less common command switches
  -g, --grayscale                     PDF will be generated in grayscale
  -h, --help                          Display help
      --htmldoc                       Output program html help
      --image-dpi <integer>           When embedding images scale them down to
                                      this dpi (default 600)
      --image-quality <integer>       When jpeg compressing images use this
                                      quality (default 94)
      --license                       Output license information and exit
  -l, --lowquality                    Generates lower quality pdf/ps. Useful to
                                      shrink the result document space
      --manpage                       Output program man page
  -B, --margin-bottom <unitreal>      Set the page bottom margin
  -L, --margin-left <unitreal>        Set the page left margin (default 10mm)
  -R, --margin-right <unitreal>       Set the page right margin (default 10mm)
  -T, --margin-top <unitreal>         Set the page top margin
  -O, --orientation <orientation>     Set orientation to Landscape or Portrait
                                      (default Portrait)
      --page-height <unitreal>        Page height
  -s, --page-size <Size>              Set paper size to: A4, Letter, etc.
                                      (default A4)
      --page-width <unitreal>         Page width
      --no-pdf-compression            Do not use lossless compression on pdf
                                      objects
  -q, --quiet                         Be less verbose
      --read-args-from-stdin          Read command line arguments from stdin
      --readme                        Output program readme
      --title <text>                  The title of the generated pdf file (The
                                      title of the first document is used if not
                                      specified)
  -V, --version                       Output version information and exit

Outline Options:
      --dump-default-toc-xsl          Dump the default TOC xsl style sheet to
                                      stdout
      --dump-outline <file>           Dump the outline to a file
      --outline                       Put an outline into the pdf (default)
      --no-outline                    Do not put an outline into the pdf
      --outline-depth <level>         Set the depth of the outline (default 4)

Page Options:
      --allow <path>                  Allow the file or files from the specified
                                      folder to be loaded (repeatable)
      --background                    Do print background (default)
      --no-background                 Do not print background
      --cache-dir <path>              Web cache directory
      --checkbox-checked-svg <path>   Use this SVG file when rendering checked
                                      checkboxes
      --checkbox-svg <path>           Use this SVG file when rendering unchecked
                                      checkboxes
      --cookie <name> <value>         Set an additional cookie (repeatable),
                                      value should be url encoded.
      --custom-header <name> <value>  Set an additional HTTP header (repeatable)
      --custom-header-propagation     Add HTTP headers specified by
                                      --custom-header for each resource request.
      --no-custom-header-propagation  Do not add HTTP headers specified by
                                      --custom-header for each resource request.
      --debug-javascript              Show javascript debugging output
      --no-debug-javascript           Do not show javascript debugging output
                                      (default)
      --default-header                Add a default header, with the name of the
                                      page to the left, and the page number to
                                      the right, this is short for:
                                      --header-left='[webpage]'
                                      --header-right='[page]/[toPage]' --top 2cm
                                      --header-line
      --encoding <encoding>           Set the default text encoding, for input
      --disable-external-links        Do not make links to remote web pages
      --enable-external-links         Make links to remote web pages (default)
      --disable-forms                 Do not turn HTML form fields into pdf form
                                      fields (default)
      --enable-forms                  Turn HTML form fields into pdf form fields
      --images                        Do load or print images (default)
      --no-images                     Do not load or print images
      --disable-internal-links        Do not make local links
      --enable-internal-links         Make local links (default)
  -n, --disable-javascript            Do not allow web pages to run javascript
      --enable-javascript             Do allow web pages to run javascript
                                      (default)
      --javascript-delay <msec>       Wait some milliseconds for javascript
                                      finish (default 200)
      --load-error-handling <handler> Specify how to handle pages that fail to
                                      load: abort, ignore or skip (default
                                      abort)
      --load-media-error-handling <handler> Specify how to handle media files
                                      that fail to load: abort, ignore or skip
                                      (default ignore)
      --disable-local-file-access     Do not allowed conversion of a local file
                                      to read in other local files, unless
                                      explicitly allowed with --allow
      --enable-local-file-access      Allowed conversion of a local file to read
                                      in other local files. (default)
      --minimum-font-size <int>       Minimum font size
      --exclude-from-outline          Do not include the page in the table of
                                      contents and outlines
      --include-in-outline            Include the page in the table of contents
                                      and outlines (default)
      --page-offset <offset>          Set the starting page number (default 0)
      --password <password>           HTTP Authentication password
      --disable-plugins               Disable installed plugins (default)
      --enable-plugins                Enable installed plugins (plugins will
                                      likely not work)
      --post <name> <value>           Add an additional post field (repeatable)
      --post-file <name> <path>       Post an additional file (repeatable)
      --print-media-type              Use print media-type instead of screen
      --no-print-media-type           Do not use print media-type instead of
                                      screen (default)
  -p, --proxy <proxy>                 Use a proxy
      --radiobutton-checked-svg <path> Use this SVG file when rendering checked
                                      radiobuttons
      --radiobutton-svg <path>        Use this SVG file when rendering unchecked
                                      radiobuttons
      --run-script <js>               Run this additional javascript after the
                                      page is done loading (repeatable)
      --disable-smart-shrinking       Disable the intelligent shrinking strategy
                                      used by WebKit that makes the pixel/dpi
                                      ratio none constant
      --enable-smart-shrinking        Enable the intelligent shrinking strategy
                                      used by WebKit that makes the pixel/dpi
                                      ratio none constant (default)
      --stop-slow-scripts             Stop slow running javascripts (default)
      --no-stop-slow-scripts          Do not Stop slow running javascripts
      --disable-toc-back-links        Do not link from section header to toc
                                      (default)
      --enable-toc-back-links         Link from section header to toc
      --user-style-sheet <url>        Specify a user style sheet, to load with
                                      every page
      --username <username>           HTTP Authentication username
      --viewport-size <>              Set viewport size if you have custom
                                      scrollbars or css attribute overflow to
                                      emulate window size
      --window-status <windowStatus>  Wait until window.status is equal to this
                                      string before rendering page
      --zoom <float>                  Use this zoom factor (default 1)

Headers And Footer Options:
      --footer-center <text>          Centered footer text
      --footer-font-name <name>       Set footer font name (default Arial)
      --footer-font-size <size>       Set footer font size (default 12)
      --footer-html <url>             Adds a html footer
      --footer-left <text>            Left aligned footer text
      --footer-line                   Display line above the footer
      --no-footer-line                Do not display line above the footer
                                      (default)
      --footer-right <text>           Right aligned footer text
      --footer-spacing <real>         Spacing between footer and content in mm
                                      (default 0)
      --header-center <text>          Centered header text
      --header-font-name <name>       Set header font name (default Arial)
      --header-font-size <size>       Set header font size (default 12)
      --header-html <url>             Adds a html header
      --header-left <text>            Left aligned header text
      --header-line                   Display line below the header
      --no-header-line                Do not display line below the header
                                      (default)
      --header-right <text>           Right aligned header text
      --header-spacing <real>         Spacing between header and content in mm
                                      (default 0)
      --replace <name> <value>        Replace [name] with value in header and
                                      footer (repeatable)

TOC Options:
      --disable-dotted-lines          Do not use dotted lines in the toc
      --toc-header-text <text>        The header text of the toc (default Table
                                      of Contents)
      --toc-level-indentation <width> For each level of headings in the toc
                                      indent by this length (default 1em)
      --disable-toc-links             Do not link from toc to sections
      --toc-text-size-shrink <real>   For each level of headings in the toc the
                                      font is scaled by this factor (default
                                      0.8)
      --xsl-style-sheet <file>        Use the supplied xsl style sheet for
                                      printing the table of content

Quelle: http://wkhtmltopdf.org/usage/wkhtmltopdf.txt

java-wkhtmltopdf-wrapper

Dank der Zuhilfenahme des wkhtmltopdf-wrappers, welchen ich in mein Projekt eingebunden habe, durch die Einbindung der Maven-Dependency, ist es nun recht mühelos mit wkhtmltopdf aus Java heraus zu arbeiten. Am einfachsten ist es, denke ich, an einem Codebeispiel mit Kommentaren zu erkennen:

import java.io.IOException;
import com.github.jhonnymertz.wkhtmltopdf.wrapper.Pdf;
import com.github.jhonnymertz.wkhtmltopdf.wrapper.configurations.WrapperConfig;
import com.github.jhonnymertz.wkhtmltopdf.wrapper.page.PageType;
import com.github.jhonnymertz.wkhtmltopdf.wrapper.params.Param;

public class WkhtmltopdfTest {
 public static void main( String[] args ) { 
  // Erzeugen eines neuen Pdf Objekts als Parameter wir eine WrapperConfig übergeben, die den Pfad der wkhtmltopdf.exe definiert.
  Pdf pdf = new Pdf(new WrapperConfig("C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe"));
  //Hinzufügen einer test HTML-Datei und Festlegung auf den Typ File aus dem Enum PageType
  pdf.addPage( "C:\\test\\test.html", PageType.file );
  //Hinzufügen diverser Parameter wie Format, Orientierung und Randgröße
  pdf.addParam( new Param( "-s", "A6" ), new Param( "-O", "landscape" ),
                new Param( "-B", "0" ), new Param( "-R", "0" ),
                new Param( "-T", "0" ), new Param( "-L", "0" ) );
  try {
   //Speichern der PDF-Datei unter dem angebenen Pfad
   pdf.saveAs( "C:\\test\\test.pdf" );
  }
  catch ( IOException | InterruptedException e ) {
   e.printStackTrace();
  }
 }
}

Dieses Programm erzeugt aus einer HTML-Datei mit dem Namen “test.html“, welche im Ordner “C:\test\“ liegt, eine “test.pdf“ im selben Verzeichnis.

Autor: André Fischer

Barrierefreie Softwareentwicklung mit Java, die praktische Umsetzung (3/3)

In diesem Artikel möchte ich anhand von Codeauszügen zeigen, wie eine barrierefreie Java-Anwendung mit Swing entwickelt und getestet werden kann.

Grundsätzliches

Ich werde hier nicht Java-Code einer komplett funktionierenden Anwendung wiedergeben, sondern nur die Teile, welche für die Barrierefreiheit wichtig sind.

Übernahme der Betriebssystemeinstellungen in Java-Software

Im ersten Artikel habe ich erklärt, dass Menschen mit einer Sehbehinderung oder mit einer Farbfehlsichtigkeit bestimmte Einstellungen im Betriebssystem vornehmen, um das Betriebssystem an ihre Bedürfnisse anzupassen.

Ihre Java-Software muss in der Lage sein, diese Einstellungen zu übernehmen, damit diese Personengruppen mit ihrer Software genauso gut arbeiten können, wie mit dem Betriebssystem. Um dies zu erreichen, muss das Look and Feel gesetzt werden.

In meiner Java-Demo-Software für Barrierefreiheit habe ich in der main-Methode folgenden Code implementiert:

// Look and Feel setzen, damit das Programm-Menü die
// große Systemschrift und die Farbeinstellungen vom &amp;amp;nbsp;Betriebssystem
// übernimmt. 
try {
   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
   e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
   e.printStackTrace();
}

Swing-Eigenschaften der Barrierefreiheit für Screenreader setzen

Folgende Accessibility-Eigenschaften sind in Swing wichtig:

AccessibleName

Es kann grundsätzlich nichts schaden, jeder Komponente einen AccessibleName zu geben. Der AccessibleName soll den Zweck der Komponente kurz beschreiben. Der AccessibleName wird von Screenreadern vorgelesen, wenn die Komponente den Fokus erhält, sprich aktiviert wird.

AccessibleDescription

Wenn die Bedeutung einer Komponente von Ihrem Namen abgeleitet werden kann, braucht man diese Eigenschaft nicht zu setzen. Fokussiert man eine Komponente bei der Tooltips gesetzt sind, bekommt die Eigenschaft AccessibleDescription den Inhalt vom Tooltip. Ansonsten muss diese Eigenschaft explizit gesetzt werden. Die Eigenschaft kann genutzt werden, um ausführlichere Informationen bereit zu stellen, z. B. für Screenreader.

// Setzen der Accessibility-Eigenschaften
void makeItBarrierefrei() {
  tfWebadresse.getAccessibleContext().setAccessibleName("Eingabefeld für Webadresse - setAccessibleName");
  tfWebadresse.setToolTipText("Eingabefeld für Webadresse - Tooltip");
  tfWebadresse.getAccessibleContext().setAccessibleDescription("Webadresse eingeben mit http://");
  btnWebAnalyse.getAccessibleContext().setAccessibleName("Schalter zum Starten der Analyse auf Barrierefreiheit");
  btnWebAnalyse.getAccessibleContext()
               .setAccessibleDescription("Schalter zum Starten der Analyse auf Barrierefreiheit. Es wird die eingegebene Webadresse nach Kriterien der BITV 2.0 analysiert!");
  btnWebAnalyse.setToolTipText("Schalter zum Starten der Analyse auf Barrierefreiheit-Tooltip");
}

Tastaturbedienbarkeit

Damit blinde und sehbehinderte Menschen die Software auch ohne Maus bedienen können, muss gewährleistet sein, dass die komplette Software per Tastatur bedienbar ist.

LabelFor

Manche Komponenten benötigen eine Beschriftung, zum Beispiel Eingabefelder. Mit LabelFor kann ein Eingabefeld mit seiner Beschriftung verbunden werden. Ist die Beschriftung durch ein Tastenkürzel/Shortcut ansteuerbar, wird das dazugehörige Eingabefeld aktiviert. Dies ist deshalb wichtig, weil blinde und sehbehinderte Menschen oft mit Tastatur arbeiten und nicht mit der Maus. Der Screenreader erkennt, wenn eine Beschriftung mit einem Eingabefeld verknüpft ist.

DisplayedMnemonic

Mit der Methode setDisplayedMnemonic(…) können Tastenkürzel gesetzt werden. Dies erleichtert die Bedienung der Software für blinde und sehbehinderte Menschen.


//Label (Beschriftung des Eingabefeldes) wird erstellt
JLabel lblWebadresse = new JLabel("Webadresse");

//Eingabefeld wird erstellt
tfWebadresse = new JTextField(40);

//Label wird mit Eingabefeld verknüpft
lblWebadresse.setLabelFor(tfWebadresse);

//Tastenkürzel wird gesetzt
lblWebadresse.setDisplayedMnemonic('w');

So, unsere Java-Anwendung ist fertig!

Aktivieren der Java Access Bridge

Jetzt aktivieren Sie die Java Access Bridge mit Hilfe von DOS-Kommandozeilen oder der Batchdatei, wie im letzten Artikel beschrieben.

Installieren und konfigurieren des kostenlosen Screenreaders NVDA

Jetzt möchten Sie testen, ob der Screenreader die hinterlegten Texte ausliest. Laden Sie den Screenreader NVDA herunter: http://www.nvaccess.org/download/.

Nicht erschrecken: Bei der Installation von NVDA ertönen regelmäßig Töne. Das hat den Grund, weil Blinde sonst nicht wissen, wann die Installation abgeschlossen ist. Nach der Installation starten Sie NDVA. Es erscheint kein Programmfenster. Das Programmsymbol trägt sich in den Benachrichtigungsbereich ein. Mit einem Rechtsklick auf das Programmsymbol im Benachrichtigungsbereich erscheint ein Menü. Dort klicken Sie auf „Einstellungen“ und danach auf „Stimmeneinstellungen“. Dort können Sie die Sprechgeschwindigkeit einstellen. Von Haus aus ist die Sprechgeschwindigkeit von NVDA sehr schnell eingestellt, weil Blinde ein sehr gut geschultes Gehör haben. Jetzt können Sie testen, ob Ihre Java-Software Screenreadertauglich ist und die Texte vorgelesen werden, welche Sie hinterlegt haben.

Autor: Markus Lemcke
Link: http://www.marlem-software.de

Barrierefreie Softwareentwicklung mit Java, Java Access Bridge (2/3)

Dieser Artikel erklärt, was die Java Access Bridge ist, wie sie installiert wird, und warum sie für die barrierefreie Softwareentwicklung mit Java wichtig ist.

Was ist die Java Access Bridge?

Die Java Access Bridge (abgekürzt JAB) übermittelt Informationen für die Barrierefreiheit von Java-Komponenten zu den unterstützenden Technologien, wie zum Beispiel Screenreader. Ein Screenreader ist eine Software, die Blinden und Sehbehinderten den Bildschiminhalt vorliest. Eine genauere Erklärung bezüglich Screenreader finden Sie in meinem ersten Artikel.

Nochmal etwas praktischer ausgedrückt: Die Java Access Bridge sorgt dafür, dass Texte, die in den Swing-Komponenten hinterlegt werden, an den Screenreader übertragen werden. Wenn die Java Access Bridge nicht installiert ist, können Blinde, trotz barrierefreier Softwareentwicklung, nicht mit der Java-Software arbeiten.

Wie wird die Java Access Bridge installiert?

Früher war die Installation der Java Access Bridge sehr umständlich. Die einzelnen Dateien mussten von Hand in unterschiedliche Verzeichnisse kopiert werden. Seit der Java Runtime Environment (abgekürzt JRE) 7, wird die Java Access Bridge mit der JRE installiert. Leider ist die Java Access Bridge nach der Installation der JRE nicht sofort aktiv.

Das aktivieren der JAB ist seit Windows 8 über die Windows-Benutzeroberfläche etwas kompliziert geworden. Sie müssen die Systemsteuerung unter Windows aufrufen und dort Erleichterte Bedienung → Visuelle Darstellung des Bildschirms optimieren und dort ganz hinunter scrollen. Dort erscheint Java Access Bridge aktivieren zum Anklicken.

Java Access Bridge in den Windows Einstellungen
Java Access Bridge in den Windows Einstellungen

Das Aktivieren über die Windows-Oberfläche hat Nachteile. Sie erkennen nicht, ob Sie die JAB für 32-Bit oder 64-Bit aktivieren und Sie können nur genau eine Java Access Bridge aktivieren.

Für Programmierer, die nicht blind sind ist das alles nicht so schlimm.

Programmierer, die blind sind und mit Android Studio, NetBeans oder IntelliJ IDEA arbeiten möchten, gibt es ein Problem. Damit die Java Access Bridge mit diesen Entwicklungsumgebungen funktioniert, muss die Java Access Bridge 32-Bit und 64-Bit installiert und aktiviert sein. Hier sind die Möglichkeiten der Windows-Oberfläche ungenügend.

Automatisiert geht es über die DOS-Befehlszeile. Über die Kommandozeile lässt sich die Java Access aktivieren, etwa über folgende Batch-Datei:

REM ggf. Anpassung der Version nötig
SET VERSION=1.8.0_112
"C:\Program Files\Java\jre%VERSION%\bin\jabswitch" -enable
"C:\Program Files (x86)\Java\jre%VERSION%\bin\jabswitch" -enable

Wenn Sie jetzt die Verknüpfung dieser DOS-Batch-Datei auf den Windows-Desktop legen, dann können Sie beide Versionen der Java Access Bridge über die Windows-Oberfläche aktivieren.

Autor: Markus Lemcke
Link: www.marlem-software.de

Barrierefreie Softwareentwicklung mit Java, Grundlagen (1/3)

Dieser Artikel ist der erste von dreien, der erläutert, wie sich mit der Programmiersprache Java barrierefreie Software entwickeln lässt.

Das Gesetz

am 1. Mai 2002 trat ein Behindertengleichstellungsgesetz (BGG) in Kraft. Dort gab es einen §11 Barrierefreie Informationstechnik. Hier wurde u. a. festgelegt, dass Träger öffentlicher Gewalt dazu verpflichtet sind ihre Webseiten barrierefrei zu gestalten. Dies war die Geburtsstunde vom „barrierefreie(n) Webdesign“.

Dieses Jahr wurde das Behindertengleichstellungsgesetz (BGG) überarbeitet. Der ehemalige Paragraph 11 ist jetzt Paragraph 12:

§ 12 Barrierefreie Informationstechnik

(1) Träger öffentlicher Gewalt im Sinne des § 1 Absatz 2 Satz 1 gestalten ihre Internetauftritte und -angebote sowie die von ihnen zur Verfügung gestellten grafischen Programmoberflächen, einschließlich Apps und sonstiger Anwendungen für mobile Endgeräte, die mit Mitteln der Informationstechnik dargestellt werden, nach Maßgabe der nach Satz 2 zu erlassenden Verordnung schrittweise technisch so, dass sie von Menschen mit Behinderungen grundsätzlich uneingeschränkt genutzt werden können. Das Bundesministerium für Arbeit und Soziales bestimmt durch Rechtsverordnung, die nicht der Zustimmung des Bundesrates bedarf, nach Maßgabe der technischen, finanziellen und verwaltungsorganisatorischen Möglichkeiten

die in den Geltungsbereich der Verordnung einzubeziehenden Gruppen von Menschen mit Behinderungen,

die anzuwendenden technischen Standards sowie den Zeitpunkt ihrer verbindlichen Anwendung,

die zu gestaltenden Bereiche und Arten amtlicher Informationen.

(2) Träger öffentlicher Gewalt im Sinne des § 1 Absatz 2 Satz 1 gestalten ihre allgemeinen, für die Beschäftigten bestimmten Informationsangebote im Intranet sowie ihre elektronisch unterstützten Verwaltungsabläufe, einschließlich Verfahren zur elektronischen Vorgangsbearbeitung und elektronischen Aktenführung, schrittweise barrierefrei. Hierzu ist die Barrierefreiheit entsprechend den allgemein anerkannten Regeln der Technik, insbesondere bei Neuanschaffungen, Erweiterungen und Überarbeitungen, bereits bei der Planung, Entwicklung, Ausschreibung und Beschaffung zu berücksichtigen. Von dem Gebot der barrierefreien Gestaltung kann abgesehen werden, wenn die barrierefreie Gestaltung unverhältnismäßigen technischen Aufwand erfordert. Die Regelungen zur behinderungsgerechten Einrichtung und Unterhaltung der Arbeitsstätten zu Gunsten von Menschen mit Behinderungen in anderen Rechtsvorschriften, insbesondere im Neunten Buch Sozialgesetzbuch, bleiben unberührt. Die obersten Bundesbehörden erstellen bis zum 30. Juni 2021 Berichte über den Stand der Barrierefreiheit der Informationsangebote und Verwaltungsabläufe nach Satz 1 und verbindliche und überprüfbare Maßnahmen- und Zeitpläne zum weiteren Abbau von Barrieren.

(3) Die Bundesregierung wirkt darauf hin, dass auch gewerbsmäßige Anbieter von Internetseiten sowie von grafischen Programmoberflächen, die mit Mitteln der Informationstechnik dargestellt werden, durch Zielvereinbarungen nach § 5 ihre Produkte entsprechend den technischen Standards nach Absatz 1 gestalten.

Anmerkung zum Paragraph 12 von Markus Lemcke: Träger öffentlicher Gewalt sind Behörden, Hochschulen und Universitäten. In Absatz 1 werden Träger öffentlicher Gewalt dazu verpflichtet Webseiten, Programme und jetzt sogar Apps barrierefrei zu programmieren. In Absatz 2 werden Träger öffentlicher Gewalt dazu verpflichtet, ihr Intranet und andere Abläufe barrierefrei zu gestalten. Ein Intranet ist ein Netzwerk von Computern, dass nicht öffentlich zugänglich ist, unabhängig vom öffentlichen Netz benutzt werden kann und andere, zusätzliche oder eingeschränkte Funktionen bietet.

Absatz 3 bedeutet auf gut deutsch, dass die Bundesregierung zu feige ist, Unternehmer dazu verpflichten ihre Webseiten, Programme und Apps barrierefrei zu gestalten.

Im obigen Paragraph ist von „grafischen Programmoberflächen“ die Rede. Damit ist Software gemeint.

Barrierefreie Softwareentwicklung – Definition

Barrierefreie Software-Entwicklung bedeutet, es entsteht eine Software, die für Menschen mit unterschiedlichen Behinderungsarten bedienbar ist. Die Zielgruppe für barrierefreie Software-Entwicklung sind Menschen mit Behinderungen. Aber auch Menschen im fortgeschrittenen Alter können körperliche Einschränkungen bekommen, bei denen eine barrierefrei entwickelte Software sehr hilfreich ist.

Richtlinien zur barrierefreien Softwareentwicklung mit Java

Damit eine Software barrierefrei entwickelt werden kann, werden Kriterien benötigt. Diese Kriterien werden in Richtlinien zusammengefasst. Zur barrierefreien Softwareentwicklung mit Java gibt es Richtlinien von Oracle, dem Unternehmen, welches Java entwickelt. Das Unternehmen IBM hat auch Richtlinien, die sich auf die Programmiersprache Java beziehen.

Wenn ich in Sachen Barrierefreiheit bei Java Kunden berate, nehme ich immer die Richtlinien von Oracle. Grundsätzlich nehme ich immer Richtlinien des Unternehmens, welches auch die Programmiersprache entwickelt hat. Leider gibt es bei der barrierefreien Softwareentwicklung noch immer keine Allgemein gültigen Richtlinien, so wie es bei “barrierefreies Webdesign” der Fall ist.

Wie arbeiten Blinde und Sehbehinderte am Computer?

Die größte Herausforderung der barrierefreien Software-Entwicklung ist es, eine Software so zu entwickeln, damit Blinde und Sehbehinderte mit ihr arbeiten können. Deswegen möchte ich erklären wie blinde und sehbehinderte Menschen am Computer arbeiten. Sie, lieber Leser, können ein kleines Experiment machen: Schließen Sie die Augen und versuchen den Mauszeiger zur rechten oberen Ecke des Programmfensters zu bewegen. Na, hat es geklappt? Nein, natürlich nicht. Das ist der Grund warum Blinde und auch sehr viele Menschen mit einer Sehbehinderung den kompletten Computer mit der Tastatur bedienen. Das bedeutet, Software welche von Blinden und Sehbehinderten bedient werden soll, muss komplett per Tastatur bedienbar sein.

Doch wie bekommen Blinde mit, was auf dem Bildschirm zu sehen ist? Sie haben eine Software, die sich „Screenreader“ nennt, auf deutsch „Bildschirmleser“. Wie der Name verrät: die Software kann nur lesen. Das bedeutet, dass eine Programmoberfläche Texte enthalten muss, welche die Programmoberfläche beschreiben. Der Screenreader kann diese hinterlegten Texte vorlesen oder an eine Braillezeile schicken. Die Braillezeile ist ein Computer-Ausgabegerät, welches den gelesenen Text in Blindenschrift, genannt Brailleschrift, darstellt. Die Buchstaben werden mit Stößel dargestellt, die aus einer Fläche herausragen. Diese Stößel können mit den Fingerkuppen ertastet werden.

Wenn Sie Lust haben Ihre Software mit einem Screenreader zu testen, dann können Sie den kostenlosen Screenreader NVDA http://www.nvaccess.org/download/ herunterladen.

Welche Anforderungen muss die Programmiersprache Java erfüllen, damit barrierefreie Software entwickelt werden kann?

In diesem Abschnitt möchte ich erklären, welche Anforderungen die Programmiersprache Java erfüllen muss, damit mit ihr barrierefreie Software entwickelt werden kann.

Es gibt Menschen mit unterschiedlichen Behinderungsarten, die in den Einstellungen des Betriebssystems Windows Anpassungen vornehmen, damit sie besser mit dem Computer arbeiten können.

Menschen mit einer Sehbehinderung stellen große Systemschrift ein, bei Einstellungen → Bildschirm. Nach dieser Änderung werden alle Schriften im Betriebssystem größer dargestellt.

Windows Einstellungen Bildschirm
Windows Einstellungen Bildschirm

Menschen mit einer Farbsehschwäche oder einer starken Sehbehinderung haben den Wunsch, einen höheren Farbkontrast einzustellen. Dies kann im Betriebssystem Windows in Einstellungen → Erleichterte Bedienung → Hoher Kontrast erreicht werden. Nach dieser Einstellung ist in der ganzen Oberfläche ein hoher Farbkontrast vorhanden.

Windows Einstellungen Kontrast
Windows Einstellungen Kontrast

Die Sache hat nur einen Haken; was nützen diese ganzen Systemeinstellungen, wenn die Software diese Einstellungen nicht übernimmt? Hier kommt die gute Nachricht: Die Programmiersprache Java kann das. Es gibt eine bestimmte Java-Befehlszeile, die dafür sorgt, dass Einstellungen des Betriebssystems übernommen werden. Wie das konkret funktioniert, erkläre ich im dritten Artikel. Wir halten fest: Die Programmiersprache Java ist in der Lage, Einstellungen des Betriebssystems zu übernehmen.

Damit blinde Menschen, mit Hilfe des Screenreaders, erfahren, wie eine Programmoberfläche beschaffen ist, müssen in dieser Texte hinterlegt sein, welche sie beschreiben.

Die Swing-Komponenten besitzen Eigenschaften, denen Texte zugewiesen werden können, welche dann vom Screenreader ausgelesen werden.

Damit der Screenreader diese Texte auslesen kann, wird eine Java Access Bridge benötigt. Was das genau ist, wie sie installiert und aktiviert wird und welche Barrieren es geben kann, erfahren Sie im zweiten Artikel.

Autor: Markus Lemcke
Link: www.marlem-software.de

Von char in int: vom Zeichen zur Zahl

Wenn Zeichen aus Benutzereingaben stammen stellt sich die Anforderung, diese in die Zahl zu konvertieren. Aus der Ziffer ‚5‘ soll das der numerische Wert 5 folgen. Nach alter Hacker-Tradition war die Lösung immer die, eine ‚0‘ abzuziehen. Die ASCII-Null ‚0‘ hat den char-Wert 48, ‚1‘ dann 49, bis ‚9‘ schließlich 57 erreicht. So ist logischerweise ‚5‘ – ‚0‘ = 53 – 48 = 5. Die Lösung hat einen Nachteil, dass sie nur für ASCII-Ziffern funktioniert.

Eine ordentliche Java-Lösung besteht zum Beispiel darin, ein char in ein String zu konvertieren und diesen über eine Integer-Methode zu konvertieren, etwa so:

char c = '5';

int  i = Integer.parseInt( String.valueOf(c) );  // 5

Die parseInt(…)-Methode ist voll internationalisiert und konvertiert ebenso Dezimalzahlen aus anderen Schriftsystemen, etwa Hindi/Sanskrit:

System.out.println( Integer.parseInt( "५" ) );   // 5

Das funktioniert, ist jedoch für einzelne Zeichen nicht besonders effizient in Schleifen. Es gibt zwei andere Möglichkeiten, mit statischen Methoden aus der Klasse Character.

getNumericValue(…)-Methode

Die Character-Methode getNumericValue(char) liefert den numerischen Wert einer Ziffer zurück; natürlich arbeitet die Methode wieder internationalisiert:

int i = Character.getNumericValue( '5' );

System.out.println( i );                         // 5

System.out.println( Integer.parseInt( "५" ) );   // 5

Die Methode ist viel leistungsfähiger, denn sie kennt den tatsächlichen „Wert“ aller Unicode-Zeichen. Zum Beispiel auch der römischen Ziffern Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, Ⅼ, Ⅽ, Ⅾ, Ⅿ, …, die im Unicode-Alphabet ab ‚\u2160‘ stehen:

System.out.println( Character.getNumericValue( '\u216f' ) ); // 1000

XXXdigit(…)-Methoden

Die Character-Klasse besitzt ebenso eine Umwandlungsmethode für Ziffern bezüglich einer beliebigen Basis, das auch in die andere Richtung.

final class java.lang.Character
implements Serializable, Comparable<Character>

  • staticintdigit(charch,intradix)
    Liefert den numerischen Wert, den das Zeichen ch unter der Basis radix Beispielsweise ist Character.digit(‚f‘, 16) gleich 15. Erlaubt ist jedes Zahlensystem mit einer Basis zwischen Character.MIN_RADIX (2) und Character.MAX_RADIX (36). Ist keine Umwandlung möglich, beträgt der Rückgabewert –1.
  • staticcharforDigit(intdigit,intradix)
    Konvertiert einen numerischen Wert in ein Zeichen. Beispielsweise ist forDigit(6, 8) gleich „6“ und Character.forDigit(12, 16) ist „c“.

Beispiel: Konvertiere eine Zeichenkette mit Ziffern in eine Ganzzahl.

 char[] chars = { '3', '4', '0' };
 int result = 0;
 for ( char c : chars ) {
   result = result * 10 + Character.digit( c, 10 );
   System.out.println( result );
 }

Die Ausgabe ist 3, 34 und 340.

 

Statischer Import

Die import-Deklaration informiert den Compiler über die Pakete, sodass ein Typ nicht mehr voll qualifiziert werden muss, wenn er im import-Teil explizit aufgeführt wird oder wenn das Paket des Typs über * genannt ist.

Falls eine Klasse statische Methoden oder Konstanten vorschreibt, werden ihre Eigenschaften immer über den Typnamen angesprochen. Java bietet mit dem statischen Import die Möglichkeit, die statischen Methoden oder Variablen ohne vorangestellten Typnamen sofort zu nutzen. Während also das normale import dem Compiler Typen benennt, macht ein statisches import dem Compiler Klasseneigenschaften bekannt, geht also eine Ebene tiefer.

Beispiel: Binde für die Bildschirmausgabe die statische Variable out aus System statisch ein:

import static java.lang.System.out;

Bei der sonst üblichen Ausgabe über System.out.printXXX(…) kann nach dem statischen Import der Klassenname entfallen, und es bleibt beim out.printXXX(…)

Bilden wir in einem Beispiel mehrere statische Eigenschaften mit einem statischem import ein:

 import static java.lang.System.out;
 import static javax.swing.JOptionPane.showInputDialog;
 import static java.lang.Integer.parseInt;
 import static java.lang.Math.max;
 import static java.lang.Math.min;
 
 class StaticImport {
 
   public static void main( String[] args ) {
     int i = parseInt( showInputDialog( "Erste Zahl" ) );
     int j = parseInt( showInputDialog( "Zweite Zahl" ) );
     out.printf( "%d ist größer oder gleich %d.%n",
                 max(i, j), min(i, j)  );
   }
 }

Mehrere Typen statisch importieren

Der statische Import

import static java.lang.Math.max;
import static java.lang.Math.min;

bindet die statische max(…)/min(…)-Methode ein. Besteht Bedarf an weiteren statischen Methoden, gibt es neben der individuellen Aufzählung eine Wildcard-Variante:

import static java.lang.Math.*;

Best Practice: Auch wenn Java diese Möglichkeit bietet, sollte der Einsatz maßvoll erfolgen. Die Möglichkeit der statischen Importe ist nützlich, wenn Klassen Konstanten nutzen wollen, allerdings besteht auch die Gefahr, dass durch den fehlenden Typnamen nicht mehr sichtbar ist, woher die Eigenschaft eigentlich kommt und welche Abhängigkeit sich damit aufbaut. Auch gibt es Probleme mit gleichlautenden Methoden: Eine Methode aus der eigenen Klasse überdeckt statische importierte Methoden. Wenn also später in der eigenen Klasse – oder Oberklasse – eine Methode aufgenommen wird, die die gleiche Signatur hat wie eine statisch importierte Methode, wird das zu keinem Compilerfehler führen, sondern sich die Semantik ändern, weil jetzt die neue eigene Methode verwendet wird, und nicht mehr die statisch importierte.

Eclipse 4.7 M3 (Oxygen)

Alle Neuigkeiten unter https://www.eclipse.org/eclipse/news/4.7/M3/.

Für mich interessanter sind:

Ctrl+E command improvements You can use the Quick Switch Editor (Ctrl+E) command to list and filter all the open editors. This works now also if you have selected a view in the editor area. You can filter the list using wildcards, and select editors using mouse or keyboard.Now you can also cycle through the list by pressing Ctrl+E again. Or use Arrow Up/Down as before.

Na endlich:

Escape text when pasting into a string literal The Java > Editor > Typing > Escape text when pasting into a string literalpreference option is now enabled by default. This will escape the special characters in pasted strings when they are pasted into an existing string literal.

To paste without escaping, you can either paste outside of a string literal, or you can disable Edit > Smart Insert Mode.

Initialisierung von Klassenvariablen

Wo werden eigentlich Klassenvariablen initialisiert? Im Konstruktor ergibt dies keinen Sinn, da für Klassenvariablen keine Objekte angelegt werden müssen. Dafür gibt es den static{}-Block. Dieser wird immer dann ausgeführt, wenn der Klassenlader eine Klasse in die Laufzeitumgebung geladen hat. Für eine statische Initialisierung wird also wieder der Compiler etwas einfügen:

Was wir schreiben Was der Compiler generiert
class Beer {
static String isFreeFor = „Homer“;
}
class Beer {
static String isFreeFor;
static {
isFreeFor = „Homer“;
}
}

Klassenintialisierer sind nicht ganz ungefährtlich, denn wenn der Code eine Ausnahme auslöst, dann gibt es einen harten lang.ExceptionInInitializerError. Leser können das testen, in dem geändert wird:

static String isFreeFor = „Homer“.substring( -1 );

und dann aus dem Hauptprogramm aufrufen:

out.println( Beer.isFreeFor );

Aufgebaute Exemplare mitzählen

Ein Konstruktor soll die Anzahl der erzeugten Objekte mitzählt; eine statische Methode liefert später die bis dahin gebauten Exemplare:

public class Rollercoaster {




  private static int numberOfInstances;




  {

    numberOfInstances++;

  }




  public static int getNumberOfInstances() {

    return numberOfInstances;

  }




  public static void main( String[] args ) {

    new Rollercoaster();

    new Rollercoaster();




    System.out.println( Rollercoaster.getNumberOfInstances() ); // 2

  }

}

Die statische Variable numberOfInstances wird bei jedem neuen Exemplar über den Konstruktor hochgesetzt. Direkt ausgeschrieben ist der Konstruktor nicht, sondern es findet ein Exemplarinitialisierer Anwendung, da der Compiler den Code automatisch in jeden Konstruktor kopiert. Das hat den Vorteil, dass Entwickler später problemlos neue Konstuktoren für den Rollercoaster hinzufügen können, ohne das Inkrement der statischen Variable immer im Hinterkopf behalten zu müssen.

Hinweis: Bei nebenläufigen Zugriffen auf statische Variablen kann es zu Problemen kommen. Deshalb müssen wir spezielle Synchronisationsmechanismen nutzen – die das Beispiel allerdings nicht verwendet. Statische Variablen können auch schnell zu Speicherproblemen führen, da Objektreferenzen sehr lange gehalten werden. Der Einsatz muss wohldurchdacht sein.

Eclipse Oxygen (4.7) M2 Neuigkeiten

Alle Neuigkeiten unter https://www.eclipse.org/eclipse/news/4.7/M2/.

Für mich als Java-Programmierer ist eignetlich nur das interessant:

Method result after step operations During debugging, the last method result (per return or throw) that was observed duringStep Into, Step Over or Step Return, is shown as first line in the Variables view.

This can be disabled with the new option Preferences > Java > Debug > Show method result after a step operation (if supported by the VM; may be slow)

Release Date für das GA:  Wednesday, June 28, 2017

GWT 2.8.0 ist raus

Details zu den Änderungen unter http://www.gwtproject.org/release-notes.html. Toll ist die Unterstützung von Java 8.

  • Started using ES6 Maps when available for HashMap/HashSet that yields up 3x performance improvements.
  • Partial support for Java 8 standard library APIs (see below for full list).
  • Source level set to Java 8.
  • Static and default methods in interfaces aren’t visible to generators. If you want to take advantage of those Java-8isms, you’re encouraged to switch to an annotation processor. This could break existing build if an interface is changed to turn a non-default method into a default method.
  • Emulate java.io.UncheckedIOException.
  • Emulate Optional<T> and its int, long, double variants.
  • Emulate Objects.requireNonNull() with message Supplier.
  • Fix Math.min/max(float/double) emulation behavior.
  • Emulate Character.isBmpCodePoint().
  • Emulate CharSequence.chars().
  • Emulate java.lang.SecurityException.
  • Emulate Java 8 API of
  • java.util.Arrays,
  • java.util.ArrayDeque,
  • java.math.BigInteger,
  • java.util.BitSet,
  • java.util.Comparator,
  • java.util.function,
  • java.util.Iterator,
  • java.lang.Iterable,
  • java.util.IntSummaryStatistics/LongSummaryStatistics/DoubleSummaryStatistics
  • java.util.Collection/Lists/Queues,
  • java.util.Map,
  • java.util.logging.Logger,
  • java.util.PrimitiveIterator,
  • java.util.Spliterator,
  • java.util.stream,
  • java.util.StringJoiner

Termine 2016 öffentlicher Seminare (Java 8)

JavaServer Pages (JSP) und Servlets (›JSP‹)

Das JSP/Servlet-Seminar vermittelt den Aufbau dynamische Webseiten mit der JSP und Servlet Technologie. JavaServer Pages (JSP) übernehmen bei der Trennung von Visualisierung und Applikationscode die Darstellung, JavaBeans die Daten und Logik. Das Protokoll …

In Dortmund 23.11.-25.11.2016

Java 8 Neuerungen (›JAVA8‹)

Java 8 bringt große Änderungen an der Sprache mit sich, die die Programmierung deutlich beeinflusst. Die größte Sprachänderungen von Java 8 betreffen Lambda-Ausdrücke, dazu gesellen sich Default-Methoden und statische Schnittstellenmethoden. Teilnehmer …

In Dortmund als Eintagesschulung am 21.11.2016

Java Grundlagen (›JAVA1‹)

Durch ihre Plattformunabhängigkeit sind Java-Programme auf unterschiedlichen Computersystemen ablauffähig. Ihre hohe Performanz und Robustheit macht Java zu einer beliebten Sprache für kritische Serverkomponenten. In diesem Seminar lernen die Teilnehmer …

In Dortmund KW 46 14.11.-18.11.2016 und wieder in 2017

Der Kurs richtet sich an Teilnehmer, die bereits Erfahrung in der objektorientierten Programmiersprache C++ haben und jetzt die Eigenschaften von Java kennen lernen wollen. Mit den leistungsfähigen Bibliotheken lernen die Teilnehmer nebenläufige Programme …

In Dortmund vom 07.11.-11.11.2016 (KW 45) zusammen mit dem Seminar Java für C#-Programmierer

Java für C#-Programmierer (›CS2JAVA‹)

Der Kurs richtet sich an Teilnehmer, die bereits Erfahrung in der objektorientierten Programmiersprache C# und dem .NET-Framework haben und jetzt die Eigenschaften von Java kennen lernen wollen. Mit den leistungsfähigen Java-Bibliotheken lernen die Teilnehmer …

In Dortmund vom 07.11.-11.11.2016 (KW 45) zusammen mit dem Seminar Java für C++-Programmierer