JavaFx - co to takiego?

Szukając alternatywy dla swing'a do tworzenia GUI aplikacji desktopowych spotkałem JavaFX. Nazwa wydawała mi się znajoma, którą widziałem na różnych stronach oraz w netbeansie. Zawsze jednak myślałem, że to jakiś framework dla specjalnej platformy (np. jakiś android czy coś). Bardzo się jednak myliłem. Okazuje się, że sam Oracle uważa JavaFX za alternatywę do Swing'a i dlatego postanowiłem się bliżej przyjrzeć tej technologii.

Po co w ogóle alternatywa?

Przypuszczam, że każdy kto próbował pisać aplikacji w Swing'u, odczuł wrażenie, że robi masę niepotrzebnych rzeczy. Stworzenie prostego GUI zajmowało dużo czasu. Jednocześnie jak już coś się stworzyło to strach było poruszyć jedną kontrolką, żeby nie rozwaliło się całe GUI. Oczywiście dało się napisać to tak, aby strachu nie było. Tylko zajmowało to jeszcze więcej czasu.

Swojego czasu używałem SWT/JFace. Muszę przyznać, że wolałem go od Swing'a. Rozkładanie kontrolek było bardziej intuicyjne, a obiekty pozwalały na lepszą ich kontrole. Jednakże GUI było brzydkie i do zrobienia czegoś ładniejszego trzeba było bardzo dużo grzebać, aby to jakoś wyglądało. W Swing'u z tym było też bardzo ciężko

Podsumowując dziedzina interfejsu graficznego dla Javy zawsze leżała i czekała na coś nowego, lepszego.

JavaFx

Młoda technologia od Oracle (Sun Microsystems). Powstała w celu tworzenia ładnych, dynamicznych aplikacji. Jest to zestaw bibliotek umożliwiających tworzenie nowoczesnych interfejsów. Jednocześnie umożliwia dostęp do niektórych zasobów sprzętowych tj. karta graficzna.

Jak to wygląda w praktyce?

Nie jestem w stanie przybliżyć Wam wszystkich możliwości tych bibliotek. Jednakże mogę przedstawić jak wygląda jej najczęstsze zastosowanie, czyli budowanie okienek GUI.

Wszystko zaczyna się od Stage. Jest to główna scena aplikacji. To właśnie jest naszym okienkiem, które posiada tytuł, ikonę oraz inne tego typu rzeczy. Następnie tworzymy Scene. Umieszczamy w niej wszystkie kontrolki oraz inne elementy GUI. Następnie pokazujemy obiektowi stage, którą scenę ma aktualnie wyświetlić i tak oto powstał interfejs użytkownika. Proste co nie?

Struktura umieszczenia elementów GUI jest drzewiasta. Na samej górze jest Stage, pod nim Scena następnie root naszych elementów GUI. Pod nim zaczynają się elementy mające dzieci (children), potem dzieci od dzieci itd... . Jak już wcześniej wspomniałem typowa struktura drzewiasta.

Dlaczego struktura drzewiasta pomaga w łatwym budowaniu GUI?

Do wytłumaczenia tego pytania użyję przykładu. Spójrz na jakiś przedmiot. U mnie to będzie laptop, na którym piszę. Z czego on się na pierwszy rzut oka składa? Z panelu użytkowego i ekranu. Mam więc dwa obszary pracy. Ekran składa się z matrycy, ramki i kamerki. To są dzieci ekranu. Panel użytkowy ma klawiaturę, touchpad, klawisz on/off, głośniki i naklejki. To są jego potomkowie. Klawiatura ma klawisze (na upartego dzieli się na klawiaturę numeryczną i alfanumeryczną, a dopiero na klawisze). Widzisz już o co mi chodzi? Po prostu dzieląc elementy na kategorię łatwiej wyobrazić sobie dany przedmiot i skupić się tylko na obszarze zainteresowania (implementowanym). Identycznie jest z interfejsem użytkownika. Użytkownik też lubi wiedzieć, gdzie może się spodziewać danego przycisku i wyszukać go w krótkim czasie. Nam też jest łatwiej w takim przypadku napisać interfejs. Dzielimy okno na części, aż dojdziemy do jednostek elementarnych naszego GUI (kontrolek) i kodzimy.

Ciekawostka

W tej technologii interfejs możemy pisać na dwa sposoby. W postaci plików xml (mających rozszerzenie fxml) oraz klas Javowych. O ile druga opcja jest na tyle fajna, że kompilator pilnuje nas czy wszystko dobrze napisaliśmy, to pierwsza opcja bardzo ułatwia i przyśpiesza pracę nad elementami GUI. Sposoby można łączyć, a nawet czasami się to zaleca. Z wykorzystaniem plików xml problemem jest stworzenie jakiś dynamicznych elementów. Z drugiej strony pozwala nam na całkowite oddzielenie logiki od widoku. Proponuje, więc wszędzie gdzie się da wykorzystywać pliki fxml, ponieważ zmusza nas to na stosowanie wzorca MVC (ostatecznie zawsze można zamienić to na klasę Javową później). Jeżeli jednak nie da się tego zaimplementować w takim pliczku nie żałuj sobie i napisz klasę Javy. Jednakże zauważyłem, że takie klasy nie są takie intuicyjne oraz ładne. Ciężko sobie w nich wyobrazić jak coś wygląda. Widząc implementacje w pliku fxml takiego problemu raczej nie ma (oczywiście, jeżeli ktoś zna składnie xml i elementów tam użytych). Można to porównać do pisania statycznych stron html.

Ciekawostka 2

Stosować można do stworzonego GUI style CSS, które upiększą (czasami i obrzydzą) wygląd naszej aplikacji. Oczywiście trzeba pamiętać o tym, że nie są to identyczne style jak do html, ale o ile łatwiejsze i szybsze jest stylizowanie widoku poprzez parametry CSS, niż ręcznie w kodzie.

Podsumowując

JavaFx to jak na razie jedyna mi znana dobra alternatywa do oldschoolowych bibliotek graficznych tj. swing i SWT/JFace. Technologia pozwala na szeroką gamę zastosowań, łatwe i proste tworzenie aplikacji desktopowych (i nie tylko) oraz na stworzenie prostego GUI do zaprezentowania dotychczasowych dokonań (bardzo dużo studentów pewnie ten fakt zadowoli).

Zapraszam do zapoznania się z praktyczną stroną technologii JavaFX.

Comments

Popular posts from this blog

Why TDD is bad practice?

How correctly imitate dependencies?

Software development using Angular 5 with Spring Boot