Was ist neu in Java 7, Teil 4: Integration

Sprachen  –  5 Kommentare

Die mit "Integration" überschriebene letzte Gruppe der mit Java 7 eingeführten Änderungen bündelt vor allem Aktualisierungen an bestehenden Standards wie in den Bereichen Unicode oder Kryptographie. Letztlich umfasst das gesamte Java-7-Release 55 Neuerungen an der Sprache und der Laufzeitumgebung.

Den Reigen an Neuerungen eröffnet die Unicode-Unterstützung. Bisher stand Unicode nur in der Version 4 in Java zur Verfügung. Es konnte mit 16 Bit nur einen begrenzten Vorrat an Zeichen abbilden. Diese Einschränkung hat sich durch die Einführung der Unicode-Version 6.0 jedoch erledigt. Neben mehr als 2000 zusätzlichen Zeichen haben deren Entwickler auch Korrekturen an bestehenden Zeichen vorgenommen und weitere Änderungen im Standard durchgeführt. Die Version 6.0 enthält damit mehr als 1000 weitere Symbole wie das Zeichen für die indische Rupie, aber auch 200 neue, vereinheitlichte asiatische Ideogramme. Drei neue Sprachen (Mandäisch, Batak und Brahmi) sowie Erweiterungen an der afrikanischen Sprache sind ebenfalls hinzugekommen. Gut zu wissen: Unicode 6 bringt eine volle Unterstützung für reguläre Ausdrücke mit. Exotisch mögen dem Betrachter die vorwiegend für asiatische Telekommunikations-Provider hinzugefügten Symbole (PDF) erscheinen.

Was ist neu in Java 7?

Die Artikel zur Reihe:

Angepasst hat man zudem die Handhabung der Währungs-Codes in Java. Nunmehr können Entwickler einfaches Anlegen und Ändern der <JAVA_HOME>/lib/currency.properties-Datei die Einstellungen für eine Währung global anpassen, ohne Änderungen an Java selbst vornehmen zu müssen. Würde Griechenland beispielsweise die Drachme wieder einführen, ließe sich das (zumindest unter Java) problemlos durch das Einfügen der entsprechenden Zeile abbilden: GR=GRD,300,0 Das Format genügt dabei der Vorgabe ISO 3166 Country code = ISO 4217 Codes.

In Java 7 wird jetzt auch zwischen der Darstellung und der Formatierung von Locales unterschieden. Eine Anwendung für deutschsprachige Benutzer, die ausschließlich mit britischen Finanzthemen zu tun hat, könnte die Gebietsschemata folgendermaßen setzen:

Locale.setDefault(Locale.Category.DISPLAY, Locale.GERMAN);
Locale.setDefault(Locale.Category.FORMAT, Locale.UK);

Ebenfalls neu ist die Konformität zur BCP-47-Norm der IETF. Sie spezifiziert mögliche Erweiterungen (Extensions) zu einer Locale, die sich mit dem Locale.Builder erstellen lassen:

Locale mylocale = new Locale.Builder().setLanguage("de").setRegion("DE").setExtension('X', "kf-upper").build();

Damit können grundsätzlich sprachunabhängige aber anwendungsspezifische Einstellungen an einer Locale gehalten werden. Etwa eine spezifische Kalenderinformation oder Angaben wie Versionsnummern des Betriebssystems und andere plattformspezifische Informationen.

Zu beachten ist jedoch, dass die zugrunde liegende Plattform keine Garantie für die Auswertung dieser Informationen gibt.

Veränderungen am Client

Clientseitig hat sich in Java 7 auch einiges getan. Hervorzuheben ist die Integration des Nimbus-Projekts. Es stellt ein alternatives Aussehen für Swing-Anwendungen bereit und war schon seit Java SE 6u10 parallel zu installieren – mittlerweile ist das Projekt ein Bestandteil von Swing geworden. Weiter sind eine Standard-JLayer-Komponente sowie halbdurchlässige Fenster hinzugekommen.

Die Nimbus-Oberfläche ist deutlich näher an aktuellen Betriebssystemen.

Die Nimbus-Oberfläche ist deutlich näher an aktuellen Betriebssystemen und hat mit dem althergebrachten Aussehen von Java-Applikationen nicht mehr viel gemeinsam. Die JLayer-Komponente lässt sich als Wrapper für beliebige anderen Komponenten verwenden. Ursprünglich an das JxLayer-Projekt angelehnt, hat man sie für Java 7 komplett überarbeitet – inklusive eines komplett separaten APIs. Mit JLayer können Entwickler auf anderen Komponenten zeichnen oder auch auf deren Events reagieren, ohne die darunterliegende Komponente zu verändern. Damit gelingen Warte-Indikatoren oder Hintergründe deutlich einfacher. Und das Mischen von Swing- und AWT-Komponenten ist ebenfalls möglich.

Besonders reizvoll sind sicherlich die halbdurchsichtigen Fenster. Das noch aus Java SE 6u10 bekannte, private API ist mittlerweile öffentlich und kann von jedem Entwickler verwendet werden. Mit dem im JDK 7 enthaltenen Lineal-Beispiel (<JDK_HOME>\demo\jfc\TransparentRuler) über dem Browser und der heise-Developer-Seite sieht das dann so aus:

Mit dem JDK 7 sind jetzt auch transparente Fenster (hier das Lineal-Beispiel) möglich.

Für mehr Geschwindigkeit im User Interface (auf X-Window-Systemen) sorgt eine neue Rendering Pipeline auf der Grundlage von XRender. Sie muss bei Bedarf durch -Dsun.java2d.xrender=true nachträglich eingeschaltet werden.

In Sachen Schriftartunterstützung bietet Java 7 gleich eine neue Spezifikation, mit der die Plattform nun OpenType-/CFF-Fonts (.otf) beherrscht. Sowohl GraphicsEnvironment.getAvailableFontFamilyNames als auch die Font.createFont-Methoden unterstützen den Standard. Die OpenType/CFF-Schriften ähneln im Aufbau den TrueType-Schriften (.ttf) – beide sind aus Bézierkurven aufgebaut. Die einen aus kubischen, die anderen aus quadratischen.

Auch unter Linux gibt es eine bessere Unterstützung für Schriftarten. Die bisher notwendigen Änderungen an der fontconfig.properties waren fehleranfällig, da das Vorhandensein einer Schriftart nicht auf allen Systemen garantiert werden konnte. Zum Auflösen unbekannter Schriftarten kommt Linux-seitig jetzt die libfontconfig-API zum Einsatz.

Und noch etwas ist neu am Client: Unter Java 7 kann die Farbwahl-Komponente nun endlich die wohl bekanntesten Koordinatensysteme zur Farbauswahl (HSL und HSV) darstellen.

Die neue Farbwahl-Komponente unterstützt jetzt auch die HSL- und HSV-Koordinatensysteme zur Farbauswahl.

Ebenfalls zum Client gezählt werden darf die neu hinzugekommene Fähigkeit, ein WebStart-JNLP-File direkt in das Applet-Tag einfügen zu können. Das spart eine Server-Anfrage und steigert so ein wenig die Geschwindigkeit. Der Inhalt der JLNP-Datei ist dazu Base64-enkodiert in ein JavaScript einzubinden:

<script src="http://www.java.com/js/deployJava.js"></script>
<script>
var attributes = {};
<!--Base64 encoded string trunc’d below for readability -->
var parameters = {jnlp_href: 'dynamictree-applet.jnlp',
jnlp_embedded: 'PCEtLSAKLyoKICogQ29weX ... HA+Cg=='};

deployJava.runApplet(attributes, parameters, '1.7');
</script>

Durch diesen Ansatz ist die gesamte JavaScript-Integration verbessert worden. Per onLoadHandler lässt sich zudem der Status der Initalisierung des eingebundenen Applets feststellen. Auch die Darstellung von Applets innerhalb und vor allem außerhalb des Browsers ist jetzt einheitlich und verbindlich definierbar, über den zusätzlichen Parameter java_decorated_frame: 'true'. Weitere Kleinigkeiten in diesem Umfeld betreffen die Möglichkeit zum partiellen Signieren von Applets und der betriebssystemspezifischen Definition und Auswahl von Anwendungs-Ressourcen.