04 maja 2008

JavaFX – WPFie, strzeż się!

Jakiś czas temu dostałem w pracy za zadanie rozeznać się w pewnej nowej technologii, jaką jest JavaFX. Nie, źle zacząłem, mały flashback...

Na jesieni zacząłem uczęszczać na spotkania AGieHowej Grupy .NET z zamiarem poznania tej technologii oraz zabrania się za C#, co by nabrać doświadczenia i mieć atuty przy szukaniu pracy, do którego się przymierzałem. Spotkania te zbiegły się w czasie z wydaniem .NETa w wersji 3.5, który posiadał wszystkie te W_F-y , a przede wszystkim WPF, czyli Windows Presentation Forms.

WPF zostało nam zademonstrowane przez jednego z szefów koła naukowego, prawdziwego entuzjastę tej technologii. Dla tych, co nie wiedzą – WPF wprowadziło zupełnie nowatorskie podejście do budowania graficznych interfejsów użytkownika: zamiast pieczołowitego układania formatek i kontrolek na okienku (jak dotychczas w Visual C++ oraz w NetBeansie) albo karkołomnego i – nie ukrywajmy – upierdliwego korzystania z różnych layoutów w Javie, tutaj opis wyglądu aplikacji sprowadzał się do ujęcia wszystkiego w XMLowym dokumencie z formacie XAML. Dawało to ogromne możliwości – nie było specjalnie ograniczeń co do zawartości kontrolek (elementem menu mógł być obrazek, a na przycisku mógł zostać wyświetlony filmik), ponadto wszystko było renderowane sprzętowo, przez co było naprawdę szybkie, można było zastosować mnóstwo efektów (gradienty, przezroczystości, deformacje), a na koniec – niektóre wartości można było zbindować z innymi, dzięki czemu część funkcjonalności można było zawrzeć w samej warstwie prezentacji, nie ruszając w ogóle prawdziwego, podpiętego pod to wszystko kodu.

A wisienką na szczycie tego tortu, jakim był WPF, była możliwość tworzenia obiektów trójwymiarowych, na których ścianach umieszczać można kontrolki. Bajer bajera bajerem pogania, dosłownie.

No, ale smutna codzienność doprowadziła do tego, że nigdy nic nie napisałem w siszarpie (najbardziej odstraszały mnie tzw. Małe różnice – wyobrażałem sobie, że siadam do napisania najprostszej siszarpowej aplikacji, i wykładam się na pierwszej linijce – bo co mam napisać? Include? Import? Czy jeszcze co innego?) i doszedłem do tego punktu w życiu każdego młodego człowieka, że musi się określić (hetero- czy homo-? Lewica czy prawica? Coca-cola czy pepsi?) i ja też wtedy się właśnie określiłem, wyszedłem z szafy i powiedziałem głośno: JESTEM JAVOWCEM. Potem znalazłem pracę (albo praca znalazła mnie) i tak już zostało.

A teraz nasz klient zapragnął przebudować warstwę prezentacji pewnej dość skomplikowanej aplikacji, którą rozwija (często z pomocą kolegów z naszej firmy) i szukał do tego jakiejś technologii. Generalnie najbardziej zależało mu właśnie na czymś takim, czego dostarcza wspomniany WPF (czyli kontrolki GUI na obiektach 3D), ale koniecznie w Javie. Pobawiłem się więc nieco JOGLem, Javą 3D oraz LWJGL (bodajże) i doszedłem do wniosku, że to jest nie do zrobienia. A wtedy on podrzucił mi – jako zamiennik – właśnie Javę FX. Przechodzę więc do meritum notki.

Java FX jest bardzo nową technologią, wciąż w fazie rozwoju i testowania. Służy ona mniej więcej temu samemu, co WPF, czyli tworzeniu interfejsów graficznych, jednak podejście ma nieco inne. Przede wszystkim do opisu komponentów nie używa żadnej odmiany XMLa, a własnego języka skryptowego JavaFX Script, który z wyglądu przypomina trochę JavęScript. Od strony funkcjonalnej JavaFX polega na wymieszaniu technologii Java2D ze Swingiem – i to w obie strony, co daje możliwości takie same, a może większe, niż WPF (tutaj także wszystko jest komponentem, płótno Javy2D może zawierać kontrolki Swinga, a kontrolki mogą zawierać elementy graficzne). Ponadto możliwa jest nie tylko grafika statyczna, a też dynamiczna (animacje), mnóstwo różnych efektów graficznych (jak w WPFie – deformacje, przezroczystości, gradienty...), rewelacyjne możliwości bindowania wartości oraz – co najważniejsze – możliwość pisania kodu w samym JavaFX Scripcie, dzięki czemu można napisać całą aplikację, nawet dosyć skomplikowaną, bez używania niczego z prawdziwej Javy. Zainteresowanym polecam obejrzenie paru przykładowych aplikacji tutaj: https://openjfx.dev.java.net/downloads.html#demos.

Technologia nadal jest tworzona i daleka jest jeszcze od finalnej wersji. Twórcy zapowiadają jeszcze więcej możliwości – nawet, jak w WPFie, możliwość tworzenia obiektów trójwymiarowych. Już teraz z jej pomocą można tworzyć bardzo ładne aplikacje o szerokich zastosowaniach – technologia nadaje się zarówno do aplikacji desktopowych, jak i appletów, stron internetowych oraz do wykorzystania na urządzenia mobilne. Pozwala wykorzystywać grafikę rastrową z plików, a także generować grafikę wektorową (kapitalną sprawą jest aplikacja do przetwarzania plików w formacie SVG na kod w JavaFX Scripcie – przejrzyjcie sobie wspomniane dema). Działa bardzo sprawnie (choć nie wiem, czy korzysta z renderowania sprzętowego) i wygląda wręcz świetnie – możliwość stworzenia programu z warstwą prezentacji napisaną w Javie FX z podpiętą pod nią logiką biznesową napisaną w Javie powoduje u mnie przyjemny dreszczyk podniecenia ;)

Ja osobiście nie mogę sie doczekać, aż będzie w ogólnym użyciu, bo pisanie w tym to prawdziwa przyjemność. Takiej frajdy nie miałem już dawno.

9 komentarzy:

Piotr Leszczyński pisze...

"Javowcem" - szczerze współczuję :) Ja po zakończeniu studiów zamierzam być informatykiem - czyli dla mnie ważne będzie przetwarzanie informacji i umiejętność odpowiedniego do tego podejścia (różnorako rozumianego), natomiast technologia jest rzeczą wtórną.

xavex pisze...

zgadzam się z Piotrkiem.. zawse będzie tak, że jedne rzeczy nadają się dobrze w pewnych zastosowaniach a inne w innych

a WPF to Windows Presentation Foundation a nie Forms ;p

ale to komentarz po przeczytaniu pierwszych kilkulinijek..

xavex pisze...

"[...] możliwość pisania kodu w samym JavaFX Scripcie, dzięki czemu można napisać całą aplikację, nawet dosyć skomplikowaną, bez używania niczego z prawdziwej Javy."

Polecam lekturę wzorców projektowych a w tym wypadku czegoś co się nazywa MVC - model View Controler.. nie ma nic podlejszego niż zakodować logikę aplikacji w warstwie prezentacji.. tego się w ogóle nie da testować ;)

wpf to nie tylko xml, xml to jest medium, oczywiście vs2008 ma do tego badziewia edytor graficzny, (więc się nie trzeba grzebać w beznadziejnych krzaczkach), taki jak do normalnych formatek, co jest wielkim plusem; a przede wszystkim różnica miedzy normalnym podejściem winforms a wpf polega na tym, ze ten drugi posługuje się grafiką wektorową, a ten pierwszy rastrową i tu jest pies pogrzebany,a nie w bajerach :P

eXistenZ pisze...

Xavex, z czym do ludzi? wiem, co to jest MVC, wiem o grafice wektorowej w WPFie i widziałem ten edytor, o którym wspominasz.

podejście Javy FX dla mnie jest dokładnie tym, czego potrzebowałem do prawdziwego zaimplementowania modelu MVC - cała "logika", o której wspominam, którą można zaimplementować w warstwie prezentacji, nie polega na przeniesieniu czego się tylko da z warstwy modelu, tylko na ogromnych możliwościach powiązania widoku z tym, co pod spodem. Dlatego mi się to tak podoba :)

xavex pisze...

Po prostu napisałeś, że całą aplikacje można zmieścić w warstwie prezentacji i zadrżałem ;)

eXistenZ pisze...

jak się chce napisać kalkulator albo programik do wyświetlania chmurek albo słoneczka w zależności od pogody za oknem, to naprawdę stosowanie do tego MVC jest przerostem formy nad treścią.

xavex pisze...

czepiam się dalej:)

"[...]nawet dosyć skomplikowaną[...]"

więc nie prostą ;)

a bardziej złożony kalkulator naprawdę warto pisać oddzielając logikę od gui

prosty oczywiście nie, ale można była o złożonych rzecczach

po prostu zazgrzytałem lekko na całą skomplikowaną aplikacje w warstwie prezentacji i tyle ;) tak sie tylko czepiam no..

eXistenZ pisze...

ja pierdzielę...

uznajmy w takim razie, że to ja się źle wyraziłem i że mówiąc o logice, którą można zawrzeć w JavaFX Scripcie miałem na myśli jednak funkcje wyglądu i prezentacji aplikacji, tylko nieco bardziej skomplikowane, niż zwykłe wyświetlacze czy przyciski, ale też pewne graficzne bajery, które ze sobą nawzajem oddziałują, tylko w warstwie wyglądu, nie sięgając w ogóle do "bebechów". Może być?

ech, niektórzy widocznie gotowi są do upadłego walczyć o wyższość swoich technologii ;)

xavex pisze...

ależ dokładnie właśnie tak uznałem, ale chciałem sprostować :)

i jestem daleki od dyskusji na temat wyższości jednej technologii nad drugą, przynajmniej dopóki nie ograniczmy się do jakichś zastosowań konkretnych.


możemy teraz uznać, że wiemy już o co nam nawzajem chodziło:)