Ustalona została już data mojej prezentacji dotyczącej JavaFX Script na warszawskim JUGu. Będzie to 22 Stycznia 2008. Drugim prelegentem będzie Radosław Holewa z Uniwersytetu Ekonomicznego w Krakowie. Obawiam się trochę spotkania najednej sali w tym samym czasie z człowiekiem, który przewyższa mnie doświadczeniem w prowadzeniu tego typu imprez. No, ale KUO i trzeba bronić honoru stolicy. Ok, tyle tytułem wstępu, a teraz czas na konkrety.

Who is Who

JavaFX Script został zaprezentowany na konferencji JavaOne w tym roku. Jest to język skryptowy pozwalający na tworzenie „Bogatych Interfejsów Użytkownika”. Swoją drogą określenie to jest nad wszech miar paskudne, pasowało by raczej „Rozbudowane interfejsy użytkownika”, ale co ja się na tym języku znam. Siłą JavaFX jest stosunkowo prosta składnia, przypominająca JSON, mało skomplikowane API i wykorzystanie Java2D. Szczególnie istotnym elementem jest ostatni punkt, ponieważ docelowo ma uwolnić programistów z bagna jakim jest pisanie animacji. No właśnie, JavaFX ma być konkurencją dla produktów Adobe i w przyszłości ma zawalczyć Flashem w dziedzinie multimedialnych treści www. Obecnie jednaj JavaFX jest w fazie Alfa co oznacza dużo radosnej twórczości programistów, a co za tym idzie wiele ciekawych buraków. Najpoważniejszym brakiem jest bardzo słaby kompilator, który nie radzi sobie z bardziej zaawansowanymi programami. Kolejnym jest wielkość samej biblioteki interpretera. Około 2MB runtime plus 300kb dodatkowych co dyskwalifikuje JFXS jako narzędzie dla weba. Jednak po kilku próbach stwierdzam, że przed JavaFX Script jak i przed całą rodziną JavaFX roztacza się bardzo dobra perspektywa. Język, jak i technologia jest stosunkowo młoda i cierpi na choroby wieku dziecięcego, ale chyba dość szybko z nich wyrośnie. Należy zadać jeszcze jedno pytanie. Dlaczego Sun znany z wysokiej jakości produktów wypuszcza na rynek produkt raczej niedopracowany i jak na standardy javowe niskiej jakości. Związane jest to ze zmianą podejścia do odbiorców tych produktów, czyli wielkiej rzeszy programistów. Sun zaczął silnie angażować się w ruch open source. Wynika to, chyba, z faktu, że od kilku lat jakość oprogramowania tworzonego na tych zasadach jest tak samo wysoka jak oprogramowania komercyjnego. W ten sposób niskim kosztem Sun zatrudnił woły robocze, w postaci programistów zajmujących się wolnym oprogramowaniem do rozwoju swojego biznesu. Pogratulować pomysłu, bo jest czego. Na serio.
Wspomniałem o JavaOne i wrócę jeszcze na chwilę do tego tematu. Otóż na konferencji zaprezentowano implementację standardu JavaFX Script, czyli OpenFX . Na tej też dystrybucji będą oparte wszelkie przykłady. Należy też wspomnieć iż JavaFXS jest jednym z elementów szerszej grupy produktów czyli JavaFX obejmującej też rozwiązania mobilne – JavaFX Mobile czy korporacyjne za pomocą JNLP.

Konkrety – Hello World

Tradycyjnie zaczniemy pracę od napisania prościutkiej aplikacji „Hello World!”. Jednak zanim przystąpimy do kodowania musimy przygotować sobie środowisko. NetBeans6.0 udostępnia plugin pozwalający na pisanie aplikacji w JavaFXS, ale ja nie będę tu korzystał z tego pluginu, zaraz opowiem dlaczego. Najpierw jednak napiszemy nasz pierwszy program.

Utwórzmy nowy projekt w eclipsie, ale taki zwykły – Project – nie javowy bo się kilka rzeczy popieprzy. Następnie ściągnijmy z repozytorium svn:

Listing 1. Ściągnięcie kodu wymaga posiadania

konta na java.net

svn checkout https://openjfx.dev.java.net/svn/openjfx/trunk openjfx --username username

Musimy jednak zarejestrować się na java.net by móc ściągnąć ten kod. Tu właśnie pojawia się istota nowej polityki Suna. Chcąc mieć bieżący dostęp do nowych technologii musimy przynajmniej częściowo uczestniczyć w społeczności. Można pobrać paczkę zip, ale nie na tym ta zabawa polega. Ja nie ściągałem trunka tylko całe repo. Ma to swój urok, ma też wady, nieważne. Mając już na dysku wszystkie pliki należy skopiować zawartość katalogu lib do katalogu z projektem. Teoretycznie można by uzyć mavena, by tworzyć zależności, ale pamiętajmy, że JavaFXS nie jest kompilowana za pomocą javac tym samym maven będzie się po prostu wywalał. Listę bibliotek jest krótka:

  • Filters.jar
  • javafxrt.jar
  • swing-layout.jar

Druga jest właściwą biblioteką, ale dwie pozostałe zawierają wiele klas niezbędnych do poprawnego działania JavaFXS. Przede wszystkim narzędzia matematyczne i do grafiki wektorowej. Żeby nie było da się to napisać w JFXS, ale było by to strasznie powolne i nie wydajne. Swoją drogą od razu widać tu, że JavaFXS ma możliwość korzystania ze zwykłych klas javowych. Następnym krokiem będzie napisanie naszego programu. Kod będzie bajecznie prosty i będzie tworzył okno o wymiarach 200x50px tytule „Witaj świecie JavaFX” i będzie zawierał napis „Witaj świecie”:

Listing 2. Witaj świecie JavaFX

/* 
* Main.fx 
*
*/

package eu.runelord.javafxjug;

import javafx.ui.Frame;import javafx.ui.Label;

Frame {
	title: "Witaj świecie JavaFX"
	width: 200
	height: 50
	content: Label {
		text: "Witaj świecie"
    }
    visible: true
 }

Mało coś tego? Dla porównania kod w Javie:

Listing 3. Odpowiednik w Javie

package eu.runelord.javafxjug;

import javax.swing.JFrame;import javax.swing.JLabel;

public class Main {

    private JFrame frame;
    private JLabel label;

    public Main(){
            initComponents();
	}

    private void initComponents() {
        frame = new JFrame("Hello World Swing!");
		frame.setSize(200, 50);
		label = new JLabel("Hello World!");
		frame.add(label);
		label.setVisible(true);
		frame.setVisible(true);
    }

    public static void main(String[] args) {
    	Main main = new Main();
	}
}

Zapewne nie jesteś zaskoczony. Celem tego krótkiego pokazu było zaprezentowanie różnicy w długości kodu. Ok, ale uruchommy nasz skrypt.

I’m Alpha and…

… and I’m just alpha version. Wspomniałem o braku kompilatora. Jest to cholerna wada, która w praktyce poważnie utrudnia rozsądne korzystanie JavaFXS na obecnym etapie. Tu też powrócę do sprawy pluginu w NB. Nie chciałem z niego korzystać ponieważ ukrywa on fakt, że uruchomienie aplikacji JFXS jest trochę kłopotliwe. Jednak po chwili wahania jak to wszytko uruchomić udało mi się wysmarować prościutki skrypt, który konfiguruje opcje jvm i classpath:

Listing 4. Uruchomienie JavaFXS, skrypt

@echo offset java=javaset opts=-Xss1024K -Xmx256M%java% %opts% -cp lib\Filters.jar;lib\javafxrt.jar;lib\swing-layout.jar; net.java.javafx.FXShell %*

Skrypt jest trochę kulawy i trzeba się nagimnastykować by go ruszyć, ale jakoś windowsowy język skryptów do mnie nigdy nie przemawiał. Należy zatem skopiować nasz skrypt do katalogu głównego projektu. Nie rozczaiłem jeszcze do końca mechanizmu pakowania skryptów w wykonywalnego jara, ale jak to rozpracuję to będzie znacznie łatwiej. Dobra uruchamiamy i… dostajemy krzaki. Kolejna wada wersji Alpha. Wyszły swojskie krzaczory, których nie można się pozbyć w prosty sposób. Znaczy się można \\u015b wstawić i po problemie.

Podsumowanie

Ze względu na wspomniany na samym początku wykład w ramach JUGa zapewne będzie więcej artykułów poświęconych JavaFX Script. Zapewne i ich poziom będzie lepszy 😉 Na koniec ciekawosta. Skompilowany plik Main.class zajmuje 963 bajty, plik Main.fx 361, a po poddaniu go małym cięciom 198 bajtów. Czyli prawie pięciokrotnie mniej. Biorąc pod uwagę, że docelowo ma to śmigać w sieci to jest super.