Aus Linux-Magazin 07/2009

Rich Internet Applications mit Java FX

© DeVIce, Fotolia.com

Browserapplikationen mit dem Komfort lokaler Programme sind der neueste Schrei. Um mit dem Eyecandy von Adobes Flash/Flex und Microsofts Silverlight oder Novells Moonlight mitzuhalten, greift Sun in die Trickkiste und wirft die neue Websprache Java FX in den Ring. Kann sie Entwickler erleuchten?

Anwendungen im Browser sind umstritten bei Anwendern und Entwicklern. Erstere wünschen sich vor allem Benutzerkomfort durch schnelle Reaktionszeiten oder Features wie Drag&Drop und Tastaturkürzel, Letztere verweisen auf die Grenzen der Client-Server-Kommunikation und versuchen mit massivem Javascript-Einsatz den Benutzungskomfort zu heben.

Lokal ablaufende Rich Clients haben da mehr Möglichkeiten. Um beide Welten zu verbinden, hat Sun bereits mit der Einführung von Java die Applets vorgestellt, doch lange Startzeiten und Inkompatibilitäten der verschiedenen Browser – gerade Microsoft war nie als großer Java-Fan bekannt – verdarben ihren Ruf. Ajax-Anwendungen, die unmittelbar im Browser nur mit Hilfe von Javascript und CSS arbeiten, sind zwar populär, viele Webentwickler misstrauen jedoch ihrer Skalierbarkeit und Interoperabilität.

Aus diesem Grund wollen die Rich Internet Applications (RIA) das Erbe der Java-Applets antreten. So nennen sich Anwendungen, die benutzerfreundliche Oberflächen und lokale Berechnungen mit der praktischen Verteilung über das Web kombinieren. Dazu benötigen sie gemeinhin ein Plugin.

Diesen Markt besetzt gegenwärtig Platzhirsch Adobe mit Flash. Die Anfangs als Spielkram für Designer abgetane Websprache hat inzwischen viel dazugelernt und bildet die Grundlage für den RIA-Aufsatz Flex [1]. Anwendungen wie Youtube oder Adobe Connect sind dank der Verbreitung auf rund 90 Prozent der Webbrowser plattformübergreifend nutzbar, bei Linux-Anwendern schwindet der Anteil aus unterschiedlichen Überlegungen und je nach Statistik auf etwa 87 Prozent ([2], [3]).

Sun versucht Comeback

Adobe bietet Entwicklern einen gefüllten Werkzeugkasten sowie gute Medienunterstützung für Musik und Filme. Vor allem aber kommt es mit einer schlanken Laufzeitumgebung aus. Wem Flash zu proprietär ist oder wer sich über zögerliche Unterstützung von 64-Bit-Architekturen ärgert, der schaut sich die freie Alternative Gnash an [4]. Microsoft Silverlight ist ein Newcomer im RIA-Markt [5] und muss sich seinen Anteil noch erarbeiten, denn erst rund 20 Prozent der Browser haben sein Plugin installiert – bei Linux noch deutlich weniger. Es basiert auf dem hauseigenen Dotnet-Framework, eine Linux-Portierung entsteht im Mono-Projekt unter dem Namen Moonlight [6].

Antiautoritäre Sprache

Im Laufe einer Dekade haben sich Internet-Bandbreite und die Rechenleistung deutlich erhöht. Dies und der erkleckliche Anteil von gut 80 Prozent aller Browser mag Suns Wunsch beflügelt haben, wieder bei den RIAs mitzuspielen. So kündigte das Unternehmen im Mai 2007 mit Java FX [7] eine neue Sprache an – ein Wortspiel mit den im Filmgeschäft üblichen Special Effects (SFX). Sie ist eine eigenständige Sprache für RIAs, nicht nur noch eine weitere Java-Bibliothek. Java FX fußt zwar technisch auf Java und benötigt ein JRE, hat jedoch auch Einflüsse aus den Skriptsprachen Javascript, Tcl und dem Grafikformat Scalable Vector Graphics (SVG).

Listing 1 demonstriert Gemeinsamkeiten mit Java wie auch neue Sprachkonstrukte: Das Paket »beispiel« definiert die Klasse »Uhrzeit«. Fremde Klassen importiert der Entwickler wie in Java, er darf sogar Klassen aus dem JDK wie »java.text.DateFormat« verwenden (Zeile 4). Die Sprache definiert Variablen und deren Typen anders als Java: Die neuen Schlüsselwörter »var« und »def« legen normale und konstante Variablen fest. Entwickler dürfen den Typ einer Variablen angeben, müssen es aber nicht. Die Variable »stunden« ab Zeile 11 bekommt den Typ »Integer«, bei »minuten« überlässt es der Entwickler dem Compiler, den Typ zu bestimmen.

Listing 1:
»Uhrzeit.fx«

01 package beispiel;
02 
03 import java.lang.System;
04 import java.text.DateFormat;
05 import java.text.SimpleDateFormat;
06 import javafx.animation.KeyFrame;
07 import javafx.animation.Timeline;
08 import javafx.lang.Duration;
09 
10 public class Uhrzeit {
11    public var stunden: Integer;
12    public var minuten;
13    public var sekunden = 0;
14    public var titel = ""; // <- über bind in Listing 2 verwendet
15    def INTERVAL: Duration = 1s;
16    def TITEL_FORMAT = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
17 
18    function tick () {
19         def einfach = 'mit einfachen Hochkommata';
20         def doppelt = "mit doppelten Hochkommata";
21         var mehrereZeilen = 'eine langer Text kann jetzt '
22                             "über mehrere Zeilen definiert werden";
23         var mitVariablen  = "mit Var '{einfach}'.";
24 
25         System.out.println("Ausgabe {mitVariablen}");
26         System.out.println("Buchstaben in mehrereZeilen="
27                            "{mehrereZeilen.length()}.");
28         // Normale Java-Klasse verwenden:
29         var now  = new java.util.Date();
30         sekunden = now.getSeconds();
31         minuten  = now.getMinutes();
32         stunden  = now.getHours() ;
33         titel    = TITEL_FORMAT.format(now);
34 
35         System.out.println("{stunden}:{minuten}:{sekunden}");
36     }
37 
38     // Konstruktor
39     init {
40         // Instanz von KeyFrame erzeugen:
41         var aktion = KeyFrame {
42                         time: INTERVAL,
43                         canSkip: true,
44                         // Funktionsreferenz:
45                         action: function() { tick(); }
46                      }
47         // Instanz von Timeline erzeugen ...
48         var zeitleiste = Timeline {
49                 repeatCount: Timeline.INDEFINITE
50                 keyFrames: [ aktion ] }
51         // ... und starten:
52         zeitleiste.play();
53     }
54 }

Sun hat das Typensystem kräftig aufgeräumt: Es gibt nur noch die Basistypen »String«, »Integer«, »Number«, »Boolean« und »Duration« für eine Zeitdauer. Die Methode »tick()« ab Zeile 18 zeigt, dass sich Stringkonstanten nun flexibler angeben lassen: Der Entwickler darf sowohl einfache (»’«) als auch doppelte (»”«) Hochkommata verwenden und die Strings über mehrere Zeilen verteilen. Wie bei einigen Skriptsprachen üblich, ersetzt Java FX in geschweiften Klammern stehende Variablen bei der Zuweisung. Die Methode »tick()« gibt daher aus:

Ausgabe mit Var 'mit einfachen Hochkommata'.
Buchstaben in mehrereZeilen=64.
21:53.0:38

Während die Sprache normale Java-Objekte wie bei »TITEL_FORMAT« in Zeile 16 nach wie vor per »new« erzeugt, gibt es für echte Java-FX-Klassen eine neue Syntax: Die einem Konstruktor ähnliche Funktion »init« ab Zeile 39 erzeugt so eine Instanz von »KeyFrame«. Java FX erlaubt es, unmittelbar beim Erzeugen des neuen Objekts den Instanzenvariablen »time« und »canSkip« Werte zuzuweisen. Die Variable »action« erhält mit »function() {tick();}« eine Referenz auf die weiter oben vereinbarte Methode. Die Klasse »KeyFrame« definiert Aktionen, die das Programm während einer Animation so ausführen soll, wie es der Entwickler über das Attribut »repeatCount« festlegt. Im Beispiel aktualisiert das Objekt die Uhrzeit im String »title«, indem sie die Methode »tick()« aufruft.

Abbildung 1: Java FX setzt skalierbare Oberflächen mit Farbverläufen, Spiegelungen und Schatten mittels Scenegraph gut in Szene.

Abbildung 1: Java FX setzt skalierbare Oberflächen mit Farbverläufen, Spiegelungen und Schatten mittels Scenegraph gut in Szene.

Bühnenbild

Bemerkenswert bei Java FX ist ferner, dass der Programmierer die einzelnen Attributzuweisungen per Komma abtrennen darf, aber nicht muss – bei Java wäre dieser Grad an Freiheit undenkbar. Ab Zeile 48 bettet der Code die »aktion« in eine neue Instanz von »Timeline« ein. Die Klasse sorgt dafür, die in einem »KeyFrame« definierten Aktivitäten zu bestimmten Zeitpunkten auch auszuführen. Im Beispiel soll das einmal pro Sekunde passieren.

Bei der Definition von Oberflächen verlässt Java FX die eingefahrenen Wege von GUI-Bibliotheken wie Swing, QT oder GTK und setzt stattdessen auf das Scenegraph-Konzept. Das sind Baumstrukturen, deren Blätter aus grafischen Primitiven wie Linien oder Texten bestehen. Innere Knoten stellen Gruppen dar. Sie enthalten Effektfunktionen wie Transformationen oder Schlagschatten, die sich auf alle Kinder auswirken. Das Konzept verwendet SVG bereits im 2D-Bereich; VRML, Java3D und 3D-PDF visualisieren so dreidimensionale Objekte. Java FX verwendet die Methode, um seine Oberfläche zu programmieren.

Listing 2 implementiert so eine lokal ablaufende Uhr, die skalierbar im Browser abläuft (siehe Abbildung 1). Ein Fenster repräsentiert Java FX ab Zeile 23 durch die Klasse »Stage« (Bühne). Sie enthält neben Angaben über Titel, Länge und Breite primär ein Bühnenbild.

Listing 2:
»Main.fx«

001 package beispiel;
002 
003 import beispiel.Uhrzeit;
004 import java.lang.Math;
005 import javafx.scene.*;
006 import javafx.scene.effect.*;
007 import javafx.scene.input.MouseEvent;
008 import javafx.scene.paint.*;
009 import javafx.scene.shape.*;
010 import javafx.scene.text.Text;
011 import javafx.scene.transform.*;
012 import javafx.stage.Stage;
013 
014 def radius: Number = 80;
015 def mitte: Number  = 125;
016 def farbe1         = Color.rgb(150,150,180);
017 def farbe2         = Color.rgb(230,230,250);
018 def zeit: Uhrzeit  = Uhrzeit{ };
019 
020 var ttX:Number = 0; var ttY:Number = 0;
021 var ttO:Number = 0; // Transparenz
022 
023 Stage {
024    title: bind zeit.titel
025    width: 250 height: 400
026    resizable: true
027    scene: Scene {
028      content: Group { // Inhalt nach rechts unten verschieben 
029        transforms: Translate {x: mitte, y: mitte}
030        content: [
031            // Gehäuse
032            Circle {
033                radius: radius+20, fill: LinearGradient {
034                   stops: [ Stop { offset: 0.7 color: Color.LIGHTGRAY }
035                            Stop { offset: 1.0 color: Color.BLACK } ]
036                }
037                stroke: Color.BLACK,
038                strokeWidth: 1
039                onMouseMoved: function(e: MouseEvent):
040                    Void { ttX = e.sceneX; ttY = e.sceneY; }
041                onMouseEntered: function(e: MouseEvent):
042                    Void { ttO = 1; }
043                onMouseExited: function(e: MouseEvent):
044                    Void { ttO = 0; }
045            }
046            // Striche
047            for (i in [0..59]) {
048                var winkel = i / 30.0 * Math.PI;
049                var breite = 1;
050                Line  {
051                    strokeWidth: breite
052                    startX: (radius + 4) * Math.cos(winkel);
053                    startY: (radius + 4) * Math.sin(winkel);
054                    endX  : (radius + 8) * Math.cos(winkel);
055                    endY  : (radius + 8) * Math.sin(winkel);
056                }
057            }
058            // Gruppe für Zeiger mit Schatteneffekt
059            Group {
060                effect:  DropShadow { offsetX: 3 offsetY: 3
061                                 color: Color.color(0.2, 0.2, 0.4) };
062                content: [
063                    // Stundenzeiger
064                    Path {
065                   transforms: Rotate {
066                       angle: bind (zeit.stunden + zeit.minuten / 60.0)
067                              * 30 - 90 }
068                   fill: Color.BLACK,
069                   elements: [ MoveTo { x: 0,         y:  0},
070                               LineTo { x: 4,         y:  4},
071                               LineTo { x: radius - 5 y:  0},
072                               LineTo { x: 4          y: -4} ]
073                    }
074                    // Sekundenzeiger
075                    Line {
076                   transforms: Rotate { angle: bind zeit.sekunden
077                                               * 6 - 90 }
078                   startX: 5 endX: radius
079                   strokeWidth: 2 stroke: Color.RED
080                    }
081                ]
082            } // Ende Zeigergruppe
083            Text {
084                x: bind ttX -mitte; y: bind ttY -mitte;
085                content: "Hello World"; opacity: bind ttO;
086            }
087        ]  // Ende Group content
088        effect:  Reflection { fraction: 0.9
089                              topOpacity: 0.5 topOffset: 2.5 }
090      } // Ende Group
091      // Hintergrund für ganze Scene
092      fill: LinearGradient {
093        startX: 0.0, startY: 0.0, endX: 0.0, endY: 1.0,
094        proportional: true, 
095        stops: [
096            Stop { offset: 0.0 color: Color.WHITE },
097            Stop { offset: 1.0 color: Color.BLACK } ]
098      }
099    } // Ende Scene
100 } // Ende Stage

Effektvolle Oberflächen

Es stellt eine Instanz von »Scene« ab Zeile 27 dar und verwendet dazu das Scenegraph-Konzept. Ein Bühnenbild enthält Gruppen, vertreten durch die Klasse »Group« oder grafische Primitive. Das sind neben Instanzen von »Circle« oder »Line« auch Flächen, Texte oder Bitmaps. Parameter wie Linienbreiten, Farben oder Schriftgröße steuern ihr Aussehen. Neben einfachen Farben stehen lineare und radiale Gradienten bereit. Der oberste Knoten im Beispiel ab Zeile 28 ist eine Gruppe, die alle ihre Elemente in die Mitte des Fensters verschiebt. Dazu wendet sie die »Translate«-Transformation auf alle im Attribut »content« definierten Inhalte an.

Gruppen kennen nicht nur einfache geometrische Operationen, sondern auch aufwändige Effekte wie »DropShadow« in Zeile 60, die einen Schlagschatten erzeugt, oder »Reflection« in Zeile 88, die die ganze Uhr auf dem Untergrund spiegelt. Anders als bei SVG dürfen Entwickler Elemente mit Java FX auch in der Sprache selbst erzeugen, etwa die Minutenmarkierungen ab Zeile 47 mittels einer For-Schleife.

Auf die Sekunde genau

Um die Uhr zu zeichnen, berücksichtigt das Programm die aktuelle Zeit für die Position der Zeiger. Dazu verwendet der Programmierer das neue Schlüsselwort »bind«. Damit verändert er den Wert einer Variablen in Abhängigkeit einer anderen. Der Code in Zeile 66 sorgt dafür, dass Java FX den Stundenzeiger neu zeichnet, sobald sich die beobachteten Variablen »zeit.minuten« oder »zeit.stunden« ändern. Das von Tcl stammende Konzept führt im Vergleich zu Javas »EventListener« zu kompakterem Code.

HTML-Coder kennen die Attribute »onMouseMoved«, »onMouseEntered« oder »onMouseExited« etwa von Javascript. Mit ihnen können sie Benutzerinteraktionen über Tastatur oder Maus mit einem Knoten des Scenegraph zulassen. Der Code ab Zeile 39 bindet anonyme Funktionen an die Attribute, um die Position und Transparenz des Elements »Text« ab Zeile 83 zu steuern.

Java FX bietet jedoch mehr nur als grafische Primitive, für Knöpfe oder Eingabefelder greift es auf die bewährten Widgets aus Swing zurück. Zum Pflichtprogramm für RIAs gehört es auch, Musik und Filme abzuspielen. Für Musik beherrscht die Programmiersprache MP3, für Filme allerdings nur das proprietäre On2-VP6-Format, das Sun zugekauft hat. Viele Entwickler würden sich hier offene und plattformübergreifende Standards wie H.264 oder die freien Formate Ogg Vorbis und Theora wünschen. Zur Kommunikation mit Servern kennen die Java-FX-Bibliotheken den einfachen Zugriff auf die üblichen Protokolle Webservices und REST sowie das JSON-Format.

Ein hübscher Sprach-Entwurf allein nützt wenig, für den Erfolg von Java FX sind ein wohlgefüllter Werkzeugkasten für die Entwickler sowie eine weitverbreitete Laufzeitumgebung bei den Anwendern nötig. Dabei geht Sun keine Risiken ein, denn Java FX basiert in großen Teilen auf Java 6 ab Update 10. Der Java-FX-Compiler übersetzt die Quellen in normalen Java-Bytecode und lässt sich mit den Java-FX-Bibliotheken auf jedem Rechner ausführen, der ein passendes JRE installiert hat. Die Java-FX-Bibliotheken bringt die Anwendung dann selbst mit. Damit ist auch klar, warum sich bestehende Java-Klassen innerhalb von Java FX benutzen lassen.

Tools zimmern Programme

Als Laufzeitumgebung bietet Sun ein vollständig neu geschriebenes Plugin an, damit Anwendungen im Browser in sinnvollem Tempo starten und laufen. Das erlaubt es Anwendern außerdem, Anwendungen per Drag&Drop aus dem Browser zu ziehen und sie anschließend eigenständig auf dem Desktop im gleichen Sicherheitskontext zu betreiben. Darüber hinaus laufen die Java-FX-Programme auch als normale Anwendung oder auf dem Mobiltelefon. Zusätzlich lassen sie sich vom Browser aus lokal installieren und sich dann wie normale Anwendungen ohne Browser nach dem Webstart-Prinzip nutzen.

Leider gibt es trotz dieser Flexibilität noch eine wesentliche Einschränkung: Offiziell steht Java FX zurzeit nur für OS X und Windows zur Verfügung, Sun will Linux und Solaris laut Punkt 3.6 ihrer eigenen FAQ erst im Laufe dieses Jahres unterstützen. Da es sich aber bei der Laufzeit- und Entwicklungsumgebung letztlich nur um normalen Java-Code handelt, läuft er auch unter Linux. Ausnahmen bestätigen dabei die Regel: Codecs für Musik und Filme müssten nativ für Linux vorliegen. Wer auf die Medienunterstützung verzichten will, findet im Kasten “Installation von Java FX” eine Anleitung, wie er die komplette Entwicklungs- und Laufzeitumgebung auf einem freien Betriebssystem installiert.

Installation von Java
FX

Sun wollte ab der Version 1.1 von Java FX auch Linux unterstützen, aber das steht noch immer aus. Da es sich bei den Entwicklungswerkzeugen (IDE, Compiler) und der Laufzeitbibliothek weitgehend um normalen Java-Code handelt, können Linux-Anwender auch das OS-X-Paket benutzen. Voraussetzungen sind ein Java ab Version 6, Update 10, sowie Netbeans 6.5.1. Sie stehen bei Sun [19] einzeln oder im Bundle zum Download für Linux bereit, die kleinste Netbeans-Version reicht aus.

Danach ist Handarbeit angesagt, um die Netbeans-Module für Java FX herunterzuladen und für Linux anzupassen. Dazu lädt der Anwender alle Module – außer dem für Windows – mit »wget« in ein temporäres Verzeichnis:

wget -nd -np -m -Rwin.nbm updates.netbeans.org/netbeans/updates/6.5.1/uc/final/stable/patch3/javafx2/ 

Jetzt entpackt er das OS-X-Modul mit Hilfe von »unzip org-netbeans-modules-javafx-sdk-mac.nbm« und ersetzt Teile des Inhalts durch ein Patch, das er per Browser von der Website [20] herunterlädt, weil sich die URL dynamisch ändert. Das Archiv legt er beispielsweise auf seinem Desktop ab:

unzip ~/Desktop/org-netbeans-modules-javafx-sdk1.1.1-lin.nbm.zip 

Vor dem Einpacken räumt der Anwender noch einige unnötige Dateien auf, bevor er wieder ein Zip-Archiv baut:

rm META-INF/*
rm netbeans/config/Modules/org-netbeans-modules-javafx-sdk-mac.xml 
rm netbeans/modules/org-netbeans-modules-javafx-sdk-mac.jar 
rm org-netbeans-modules-javafx-sdk-mac.nbm
zip -r netbeans/ Info/ META-INF/ main/ org-netbeans-modules-javafx-sdk-lin.nbm  

Das Ergebnis ist ein neues Modul für Linux, das sich zusammen mit den anderen heruntergeladenen Dateien in Netbeans installieren lässt. Dazu öffnet der Anwender in Netbeans mit »Tools | Plugins« den Plugin-Dialog (siehe Abbildung 4). Er fügt auf dem »Downloaded«-Tab alle heruntergeladenen Module hinzu und installiert sie.

Durch das Umpacken sind die Module nicht mehr signiert, daher muss er hier ausnahmsweise die Warnung ignorieren. Danach steht in Netbeans die volle Java-FX-Unterstützung zur Verfügung. Will der Anwender die erzeugten Java-Archive ohne IDE nutzen, verwendet er »javafx« statt »java«:

export JFX=~/.netbeans/6.5/javafx-sdk
$JFX/bin/javafx -Djava.ext.dirs=$JFX/lib/desktop:$JFX/lib/sharedU 
 -jar Anwendung.jar

Der Compiler liegt im Modulverzeichnis von Netbeans, mit dem Parameter »-Djava.ext.dirs=Pfade« bindet er die notwendigen Java-FX-Bibliotheken ein.

Der auf den üblichen Java-Compiler aufbauende »javafxc« [8] ist für Sun im Hinblick auf das jahrelange Hickhack um Java ungewöhnlich frei unter der GPL lizenziert, das als eigene Bibliothek paketierte Scenegraph steht unter der gleichen Lizenz [9].

Für Commandline-Freaks und Maus-Schubser

Für die Entwicklung von Java FX ist Suns Entwicklungsumgebung Netbeans die erste Wahl. Das Java-FX-Modul erlaubt es, Projekte zu editieren, zu bauen und zu testen. Beim Editieren hilft die umfangreiche Palette, mit der sich Quelltext über Drag&Drop zusammenbauen lässt (siehe Abbildung 2). Ein vergleichbares Plugin für Eclipse ist in Arbeit, kommt aber in seinen Möglichkeiten noch nicht an das von Netbeans heran [10].

Abbildung 2: Syntax-Highlighting und spezielle Paletten erleichtern Anwendungsentwicklern den Einstieg, um in Netbeans für Java FX zu programmieren.

Abbildung 2: Syntax-Highlighting und spezielle Paletten erleichtern Anwendungsentwicklern den Einstieg, um in Netbeans für Java FX zu programmieren.

Eine Alternative zur klassischen IDE ist das JFXPad [11], das Java FX wie eine Shell direkt als Interpreter-Sprache ausführt. Doch die typischen Entwicklerwerkzeuge wie ein IDE oder Interpreter reichen für den RIA-Markt allein nicht aus: Grafik- und Design-affine Flash-Entwickler erarbeiten am liebsten zunächst einen Großteil ihrer Oberflächen mit Bitmap- und Vektorgrafik-Werkzeugen. Sind sie mit dem Ergebnis zufrieden, fügen sie später die Programmlogik hinzu.

Sun hilft Zeichnern

So enthält Suns kostenlose Production Suite [12] Plugins für Adobe Illustrator und Photoshop sowie einen SVG-Konverter. Linux-Anwender verwenden hier Inkscape, dessen aktuelle Entwicklungsversion Vektorgrafiken als Java-FX-Scenegraph zu exportieren vermag. Abbildung 3 zeigt den Seitenriss einer 470er Rennjolle, einem bekannten Regattaboot. Inkscape ist in der Lage, die auf Wikimedia liegende Zeichnung nach Java FX zu exportieren. Das Ergebnis lässt sich nicht nur statisch einbinden, sondern auch per Code positionieren oder einfärben. Leider erzeugt der Export noch eine veraltete Java-FX-Syntax, die Ergebnisse erfordern etwas Handarbeit [13]. Abhilfe versprechen die Patches [14] von Sergey Esenov, sie sollen Teil der nächsten Inkscape-Release 0.47 sein.

Mit den zur Verfügung stehenden Werkzeugen lassen sich auch unter Linux schnell Anwendungen entwickeln. Gerade anfangs werden Entwickler neben den vielen Beispielanwendungen in Netbeans immer wieder die Java-FX-Seite zu Rate ziehen wollen. Hier findet sich neben der Software und Spezifikation eine Reihe von Tutorien.

Darüber hinaus lohnt sich ein Blick auf diversen Blogs (etwa [15], [16], [17]) und das Java-FX-Wiki [18]. Auf dem Buchmarkt erscheinen im Sommer mehrere Werke über Java FX. Leser sollten allerdings darauf achten, dass diese nicht inzwischen veraltete Vorversionen behandeln, da es davon einige Titel gibt.

Abbildung 3: SVG-Zeichnungen lassen sich per Inkscape nach Java FX übernehmen.

Abbildung 3: SVG-Zeichnungen lassen sich per Inkscape nach Java FX übernehmen.

Abbildung 4: Sun unterstützt offiziell noch kein Java FX für Linux. Wer jedoch das Paket für OS X herunterlädt und etwas aufräumt, darf die so erzeugten Netbeans-Module per Plugin-Manager installieren.

Abbildung 4: Sun unterstützt offiziell noch kein Java FX für Linux. Wer jedoch das Paket für OS X herunterlädt und etwas aufräumt, darf die so erzeugten Netbeans-Module per Plugin-Manager installieren.

Orakelhafter weiterer Weg

Bei neuen Technologien wie Java FX stellt sich die Frage, ob sich ein Um- oder Einstieg lohnt. Wer schon viel Java einsetzt und bestehenden Code weiterverwenden möchte, fühlt sich in der Sprache schnell heimisch. Spätestens jedoch vor dem Hintergrund der Übernahme von Sun durch Oracle ist die Zukunft und die weitere Unterstützung von Java FX ein viel diskutiertes Thema. Kritiker hätten an Stelle der vollständig neuen Sprache Java FX lieber eine Weiterentwicklung von Swing gesehen.

Stattdessen arbeiteten viele Sun-Entwickler an Java FX oder sie verließen ihren Arbeitgeber. So sind die beiden Autoren der Swing-Bibel “Filthy Rich Clients”, Chet Haase und Romain Guy, inzwischen bei der Weiterentwicklung von Adobe Flex und Google Android zu finden. Schon laufende Swing-Weiterentwicklungen, darunter Painter, Beans-Bindings oder das Application Framework, sind deshalb größtenteils eingeschlafen.

Es gibt aber auch Kritik an Java FX selbst: Die Medienunterstützung überzeugt zurzeit noch nicht. Statt offene Standards zu integrieren, kaufte Sun proprietäre Codecs nach, die sich noch als Stolperstein für die lange versprochene offizielle Linux-Unterstützung entpuppen könnten. Zwar laufen die meisten mit Java FX entwickelten Applets ebenso wie die in Java geschriebenen, aber spätestens bei der Medienwiedergabe hakt es dann.

Sun wirft Balast ab und wagt neue Ideen

Generell ist Suns Entscheidung zu begrüßen, die ausgetretenen Pfade zu verlassen und etwas Neues zu entwickeln. Java hat in den letzten zehn Jahren (wie jede Sprache) eine Menge unbenutzten Code und Denkfehler angesammelt. Sun nutzt den Bruch, um mit Java FX Ballast im GUI-Bereich abzuwerfen. Dank kompakter Schreibweise, Scenegraph und Bindings lassen sich grafiklastige Anwendungen wesentlich einfacher entwickeln als mit Swing.

Bestehenden Java-Code für Anwendungslogik oder die Anbindung von Datenbanken dürfen Programmierer weiterverwenden. Leider fällt er dann durch eine andere Syntax auf. Dass Java FX die bei Ajax und RIA üblichen Client-Server-Protokolle REST und Webservices von Haus aus unterstützt, vereinfacht die Arbeit der Programmierer auch auf der Seite des Servers.

Sun hat eine bemerkenswert pragmatische Grundlage für Rich Internet Applications geschaffen. Der Erfolg der neuen Sprache wird sich daran messen, wie der Anbieter sie mit Werkzeugen, Bibliotheken und Aktivitäten dauerhaft unterstützt und wie viele Entwickler sich von ihren Vorzügen überzeugen lassen. (mg)

Infos

[1] Adobe Flash/Flex: [http://adobe.com/flex]

[2] Plugin-Marktanteile: [http://statowl.com]

[3] Verfügbarkeit von RIA-Plugins nach Sprache und Betriebssystem:[http://riastat.com]

[4] Gnash: [http://gnu.org/software/gnash/]

[5] Silverlight: [http://silverlight.net]

[6] Moonlight:[http://mono-project.com/Moonlight]

[7] Java FX: [http://www.javafx.com]

[8] Openjfx-Compiler:[http://openjfx-compiler.dev.java.net]

[9] Java-FX-Scenegraph:[http://scenegraph.dev.java.net]

[10] Eclipse-Plugin für Java FX:[http://kenai.com/projects/eplugin/]

[11] Jfxpad: [http://jfx.wikia.com/wiki/JFXPad]

[12] Java Production Suite:[http://java.sun.com/javafx/1/reference/production-suite-install/]

[13] Inkscape-Patch:[http://www.nabble.com/JavaFX-1.0-exporter-update-td21389638.html]

[14] Inkscape-Update für aktuelle Java-FX-Syntax:[http://piliq.com/javafx/?page_id=227]

[15] The Planetarium:[http://blogs.sun.com/theplanetarium/]

[16] Java Desktop Links für Swing und Java FX: [http://jonathangiles.net/blog/]

[17] Java-FX-Blog: [http://blogs.sun.com/javafx/category/Community]

[18] Planet JFX Wiki: [http://jfx.wikia.com/wiki/Planet_JFX_Wiki]

[19] Download von Sun JDK und Netbeans: [http://java.sun.com/javase/downloads/]

[20] Patch für Java FX unter Linux: [http://liuwangxia.javaeye.com/blog/356681]

Der Autor

Carsten Zerbst entwickelt Individual-Software im CAD- und PDM-Umfeld für die Luft- und Raumfahrtindustrie und den Schiffbau.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben