niedziela, 24 marca 2013

Wielowątkowo

Niedawno miałem problem z wypisaniem danych(adresów email,tytułów wiadomości oraz dat otrzymania) do tabeli(TableView), problemem była taka integracja - by TableView uzupełniał się podczas uruchamiania i po jego zakończeniu(jest to o tyle upierdliwe że wiadomości są dość ciężkie i trochę to trwa).
Naturalnym jest sięgnięcie po wielowątkowość - wszystko pięknie, bach wątek: uruchamiamy go w metodzie odpowiedzialnej za inicjalizacje(u mnie jest to "initialize" w kontrolerze).
Tylko co teraz ? na pierwszy rzut oka wszystko powinno działać - od naciśnięcia "run project" dzielą nas już nie minuty a sekundy, odpalamy i ... BUM
NullPointerException...
WTF ? no niestety jak ktoś robi tak jak ja, najpierw naskrobie - potem się dowie, ląduje z nullpointerami i innymi dobrodziejstwami wyjątków. Dziwne było to że TableView wypełniał kilka pierwszych pól(różnie 10-15-30). W momencie którym aplikacja czekała na wykonanie wątku wszystko było ok(prócz czasu uruchamiania, średnio 30sekund).
Na szczęście stackoverflow :* Okazało się że nie możemy modyfikować niczego co pracuje akurat z aktywną sceną - nasz wątek musimy wykonać w wątku aplikacji(javafx application thread), możemy to zrobić za pomocą runLater albo runAndWait.
Po modyfikacji wyglądać to będzie tak:
Jeżeli chodzi o wielowątkowość w JavaFX to materiały o niej nie są jakoś oszałamiające, ale jest nadzieja ! podobno w JDK 8 ma się coś poprawić :)

niedziela, 10 marca 2013

JavaFX integracja z CSS

CSS czyli Kaskadowe arkusze stylów pozwalają nam określić sposób wyświetlania elementów(w tym przypadku) aplikacji. Oracle zapewnia całkiem przyjemne tutoriale - dla CSS w FX też się znalazł: Fancy Forms with JavaFX CSS.

My dokończymy dzisiaj program rozpoczęty w ostatnim poście. Jako że nie ma co przesadzać(bo co tam można upiększyć :D ) - zmienimy tylko tło oraz dodamy jakiś efekt przyciskom.
Pierwszą rzeczą jaką zrobić trzeba to stworzenie pliku CSS. Druga rzecz to "zapoznanie ze sobą" naszego pliku CSS oraz wcześniej stworzonego pliku FXML. W pliku FXML dodajemy: Teraz będziemy modyfikować plik CSS. Dodamy nowe tło(białe nie wygląda najlepiej). W tym celu dodamy właściwość dla background-image. .root - określa nam właściwość dla instancji sceny.
-fx-background-image - tło pobieramy z pliku(url("sample.jpg"))
-fx-background-color: - w tym przypadku wygenerowało by nam tło z podanego przez nas koloru(np: #2A5058)
Ja zwiększyłem sobie jeszcze rozmiar tekstu o kilka px: -fx-font-size: 13px;

Mamy już tło(inwencja twórcza wskazana) teraz czas na przyciski. -fx-text-fill:white; - wypełnienie tekstu.
-fx-font-family:"Arial Narrow"; - jego czcionka.
font-weight: - "waga czcionki".
-fx-background-color: linear-gradient(#61a2b1, #2A5058); - generujemy kolor tła.
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 ); - JavaFX CSS Reference Guide

:hover - odpowiada za aktywną wersje pola(tu przycisku).

Właściwości takie jak .button czy .Text odpowiadają za "ogół". Jeżeli chcemy być bardziej szczegółowi - i chcemy odnieść się do jednego przycisku czy pola możemy odnieść się do stworzonego przez nas id pola np: fx:id="actiontarget" w takim przypadku odniesienie w CSS wyglądało by następująco:
Dzięki tym 14 linijką app. wygląda trochę bardziej znośnie :) moim zdaniem nie wyszło najgorzej.