JavaFX
Platforma .NET w wersji 3.5 wprowadziła rewolucyjne podejście do projektowania interfejsów graficznych aplikacji, gdzie zamiast układania kontrolek i opisywania ich za pomocą kodu, używa się specjalnej odmiany XMLa, zwanego XAMLem, gdzie każdy obiekt jest komponentem (czyli może zawierać inne obiekty), gdzie wszystko jest renderowane za pomocą procesora graficznego i generalnie wygląda nieźle.
Java postanowiła nie pozostawać w tyle, i stąd pomysł technologii JavaFX, która nie dość, że w znakomity sposób ułatwia tworzenie aplikacji z kontrolkami Swinga, to jeszcze daje możliwość perfekcyjnego łączenia Swinga z elementami graficznymi z technologii Java2D oraz – docelowo – Java3D.
Pierwszy kontakt z JavąFX miałem jeszcze w kwietniu, kiedy to miałem za zadanie rozpoznać tą technologię z zamiarem potencjalnego wykorzystania w mocno opartej na GUI aplikacji. Wtedy była ona jeszcze w fazie rozwoju – zaawansowanej, ale jednak rozwoju. Oczywiście, tak jak człowiek uczy się przez całe życie, tak technologie nigdy nie przestają się rozwijać, jednak w tym przypadku oznaczało to typową wersję beta, gdzie nie wszystko jeszcze działało, nie wszystko było udokumentowane, a niektóre operacje miały nieprzewidziane skutki. Ale już wtedy, muszę przyznać, JavaFX nieźle rokowała. Działała bardzo dobrze, wyglądała świetnie i była łatwa w obsłudze.
Co to jest?
JavaFX jest technologią do tworzenia bogatych wizualnie aplikacji internetowych (RIA – Rich Internet Application), przeznaczona nie tylko pod wiele systemów operacyjnych, ale też – docelowo – na wszystkie urządzenia z ekranem („bring Java to all the screens of your life” brzmi hasło reklamowe). W tej chwili już jest dostępna wersja JavyFX na komputery (JavaFX Desktop), w 2009 roku ma być udostępniona wersja na urządzenia mobilne (JavaFX Mobile) a w 2010 planowane jest wdrożenie platformy TV (JavaFX TV).
Aplikacje te pisane są w języku JavaFX Script - podobnym składniowo do JavaScripta, w pełni zorientowanym obiektowo (obiekty opisywane w formacie JSON). Język daje możliwości powiązania (binding) właściwości różnych obiektów między sobą albo z wartościami zmiennych oraz zawiera mnóstwo efektów graficznych, statycznych oraz ruchomych (animowanych). Wszystko to pozwala na tworzenie zaawansowanych i bardzo efektownych interfejsów graficznych dla aplikacji – ten prosty programik prezentuje jednocześnie efekty graficzne (przezroczystość), jak i animację obiektów – oraz pozwala na utworzenie prostych aplikacji – takich, które nie kryją za sobą na tyle skomplikowanej warstwy biznesowej, żeby trzeba do tego było angażować cały model MVC, jak np. ten prosty analizator amerykańskiego rynku akcji.
Ale na szczęście JavaFX ma także zastosowanie tylko jako warstwa wizualna – kod w JavaFX Scripcie może zostać dołączony jako część projektu, napisanego w Javie, służąca tylko do jego wizualizacji, a pod spodem mogą znajdować się dowolnie skomplikowane funkcjonalności.
Dystrybucja
Na stronie www.javafx.com można pobrać specjalną wersję NetBeansa 6.1, która jest dostosowana do pisania w niej aplikacji JavaFX (oczywiście, posiadacze „zwykłego” NetBeansa 6.1 mogą bez problemu sobie JavaFX SDK doinstalować, w menu Tools -> Plugins, zakładka Available Plugins). SDK dostarcza kilku użytecznych narzędzi, ułatwiających poruszanie się po języku JavaFX Script, takich, jak biblioteka obiektów i właściwości albo podręczny podgląd projektowanej aplikacji.
Podobny podgląd dostępny jest także w webowej (tzn. dostępnej przez Java Web Start) aplikacji JavaFXPad – w dolnej części okna mamy edytor kodu, gdzie możemy wkleić dowolny kod JavaFX Scripta, w górnej – podgląd aplikacji w czasie rzeczywistym.
Możliwości
Na stronach projektu znajduje się kilka przykładów aplikacji, prezentujących możliwości technologii, np. symulacja dymu albo losowe generowanie fraktali. Ale większą bibliotekę przykładów można znaleźć na stronach Wiki projektu – zawarte tam są przykłady kodu do konkretnych zastosowań (np. połączenie z bazą danych czy wyświetlenie aplikacji na pełnym ekranie albo zawarcie jej na stronie WWW), oraz bardzo ciekawe dema – z tych ostatnich na szczególną uwagę zasługuje SVG Translator – program ten przerabia obraz w formacie SVG (Scalable Vector Graphics – wolny i otwarty uniwersalny format opisu dwuwymiarowej grafiki wektorowej) na – uwaga – kod w JavaFX Scripcie, który, uruchomiony, wygeneruje dokładnie taki sam obraz.
JavaFX w materiałach promocyjnych na stronie głównej obiecuje bardzo wiele, ale powyższe przykłady pokazują, że w owe obietnice można wierzyć – gdy już pojawi się finalna wersja JavaFX 1.0, będzie to wydarzenie, które śmiało będzie mogło być nazwane początkiem nowej ery.
Przykład
W ramach mojego rozpoznawania JavaFX naskrobałem taki prosty program, który prezentuje jednocześnie kilka istotnych cech tej technologii:
- Bezszwowe (seamless) połączenie elementów graficznych i kontrolek Swingowych
- Powiązanie (binding) między właściwościami obiektów (wartość na suwaku z kątem odchylenia strzałki)
- Animacja – spróbujcie kliknąć przyciski „Zero” i „Random”
- Wreszcie i całe pole aplikacji można przesuwać w dowolne miejsce ekranu (czego akurat nie można przetestować w JavaFXPadzie, tylko po skompilowaniu programu np. w NetBeansie)
import javafx.ui.*;
import javafx.ui.canvas.*;
import javafx.ui.filter.*;
import java.lang.Math;
class Wind {
attribute angle:Number;
attribute sAngle:Number;
attribute tAngle:Number;
public operation setAngle(nAngle:Number);
public operation zero();
public operation random();
}
operation Wind.setAngle(nAngle) {
tAngle = nAngle;
sAngle = angle;
angle = [sAngle..tAngle] dur Math.abs(tAngle-sAngle)*2 linear;
}
operation Wind.zero() {
setAngle(0);
}
operation Wind.random() {
setAngle((Math.random()*360).intValue());
}
class Windsign extends CompositeNode {
attribute wind:Wind;
}
function Windsign.composeNode() =
Group {
var x = 50
var y = 50transform: bind translate(x, y),
onMouseDragged: operation(e) {
x += e.localDragTranslation.x;
y += e.localDragTranslation.y;
}
toolTipText: "You can totally drag me around!",
content: [
Circle {
cursor: HAND,
cx: 50,
cy: 50,
radius: 50,
fill: cyan,
stroke: blue,
strokeWidth: 2,
},
Polygon {
points: [50,0,
55,98,
50,95,
45,98]
fill: darkblue
transform: bind rotate(wind.angle,50,50)
}
]
};
Frame{
var wind = Wind {}
var ws = Windsign { wind:wind }
title:"Windsign"
background: white
visible:true
content:
BorderPanel {
top: FlowPanel {
background: white,
content: [
Slider {
min: 0,
max: 360,
minorTickSpacing: 15,
majorTickSpacing: 45,
paintTicks: true,
value: bind wind.angle,
},
Button {
text: "Zero",
action: operation() {
wind.zero();
}
},
Button {
text: "Random",
action: operation() {
wind.random();
}
}
]
}
center: Canvas {
background: white
content:ws
}
}
}
Kod zamieszczony powyżej można przekleić do okna edycji w programie JavaFXPad.
Źródła
- http://www.javafx.com/ – bogata graficznie (utworzona w tej technologii) strona domowa projektu
- http://java.sun.com/developer/technicalArticles/javafx/ – zbiór artykułów i tuto riali do JavyFX
- http://java.sun.com/javafx/reference/ – dokumentacja, pliki do pobierania i przykłady
- http://jfx.wikia.com/wiki/Planet_JFX_Wiki – strona Wiki projektu JavaFX








October 13th, 2008 at 16:58
Szkoda tylko, ze to nie pracuje na komputerach 64 bitowych…
October 18th, 2008 at 18:34
Korekta .. w pierwszym zdaniu “Platforma .Net w wersji 3.0 zamiast 3.5″ ;)
October 25th, 2008 at 14:27
Jeżeli porównać JavaFX z Flex’em to niestety, trzeba stwierdzić, że Flex bije na głowę JaveFX.
December 3rd, 2008 at 13:22
mam nadzieje ze z tym flexem to tak tylko poki co.. flex jest juz troche na rynku a fx dopiero wchodzi takze moze sie rozwinac… ja pamietam jak na poczatku ludzie sie z php smiali :P
December 3rd, 2008 at 15:04
i dalej się śmieją :D
December 18th, 2008 at 15:58
Problemem JavaFX jest składnia, o wiele bardziej zagmatwana niż we Flex’ie. Szkoda, że Sun nie dał możliwości definiowania GUI w czystym xml’u. Jest to ogromne ułatwienie przy tworzeniu interfejsu.
June 9th, 2009 at 11:21
Całe te dżawaskripty, fleksy i inne iksy to jedno bagno. Kończy się to zwykle tym, że aplikacja ma 100k linii i 3 stateless sessoin beany lub 3 sensowe managiery springowe. Reszta logiki w guju :]