Uczyłem się JavaFX od kilku tygodni. Oto ogólny przegląd tego, jak w moich oczach wypada on w porównaniu z WPF:
Wszystkie moje komentarze dotyczą JavaFX 2.0. Informacje te prawdopodobnie ulegną zmianie, ponieważ platforma jest wciąż dość niedojrzała i jest aktywnie rozwijana.
Grafika
Podobnie jak WPF, JavaFX używa zachowanego systemu renderowania grafiki. Interfejs użytkownika zawiera wykres sceny, który składa się z „węzłów”, które można uznać za koncepcyjnie podobne do WPF UIElement
.
JavaFX odciąży renderowanie grafiki do GPU, jeśli jest dostępne. System graficzny wykorzystuje DirectX w systemie Windows i OpenGL na innych platformach.
Narzut
Interfejsy użytkownika JavaFX można tworzyć zarówno w kodzie, jak i za pomocą znaczników FXML, które są podobne do XAML, ponieważ graf obiektów można tworzyć przez zagnieżdżanie elementów.
FXML ma pewne funkcje podobne do XAML, takie jak powiązanie właściwości (tylko proste wyrażenia) i powiązanie z programami obsługi zdarzeń (dowolna metoda onEvent ). Procedury obsługi zdarzeń można zadeklarować w linii, ale zazwyczaj tworzy się powiązanie ze zdarzeniem w skojarzonym kontrolerze.
Pliki FXML mogą mieć powiązany kontroler, który umożliwia deklarowanie złożonych programów obsługi zdarzeń i konfigurowanie powiązań między właściwościami. Jest to kontroler w sensie MVC i nie jest tym samym, co viewModel w świecie WPF (zwykle kontroler będzie miał odwołania do węzłów i kontrolek).
Jedną z różnic w stosunku do WPF jest to, że wydaje się, że FXML nie jest kompilowany do pośredniej reprezentacji binarnej, takiej jak BAML. Nie zauważyłem jeszcze żadnych problemów z wydajnością, ale nie korzystałem z systemu intensywnie. Zauważyłem jednak, że FXML zwykle jest krótszy niż jakikolwiek XAML, ponieważ platforma nadal zachęca do pisania kodu, a style są deklarowane osobno.
Wprowadzenie do FXML można znaleźć tutaj .
Kreator scen jest dostarczany bezpłatnie (jak w piwie), więc jeśli nie lubisz ręcznie kodować interfejsu użytkownika, możesz przeciągać i upuszczać elementy, ustawiać właściwości i wiązać się z kodem w kontrolerze, a FXML zostanie wygenerowany automatycznie. Oczywiście konstruktor scen nie jest tak potężny jak Expression Blend, ale nadal jest lepszy niż „projektant” dostarczany przez Visual Studio.
Wiążący
JavaFX ma bardzo potężny system właściwości i powiązań. Wzorzec Java Bean został rozszerzony o klasy, które hermetyzują właściwość (podobnie do sposobu, w jaki właściwości zależności WPF reprezentują właściwości). Te klasy implementują interfejsy, które zapewniają powiadomienia o unieważnieniu i zmianie.
Istnieje rozróżnienie między powiadomieniami o unieważnieniu a powiadomieniami o zmianach. Unieważnienia mówią tylko, że wyrażenie wiążące jest teraz nieprawidłowe i musi zostać ponownie obliczone; ponowne obliczenie nie następuje w rzeczywistości, dopóki nie zażądasz wartości właściwości za pomocą jej metod get()
lub getValue()
. Jeśli jednak zarejestrowałeś odbiornik zmian, wyrażenie zostanie natychmiast ponownie ocenione i wszystko, co jest powiązane z tą właściwością, będzie odzwierciedlać zmiany.
JavaFX uwidacznia te właściwości w podobny sposób jak WPF z właściwością get i set oraz metodą, która zwraca wystąpienie opakowania właściwości (które nie jest statyczne, jak właściwości WPF).
Złożone powiązania można tworzyć między wieloma właściwościami. Chcesz, aby właściwość całkowita była sumą dwóch innych (a = b + c)? Nie ma problemu, JavaFX zapewnia Fluent API do wyrażania tego rodzaju relacji, np
A.Dodaj (B, C);
Jeśli wartość B lub C ulegnie zmianie, wówczas zostaną podniesione odpowiednie powiadomienia, aby system wiedział, że A należy ponownie ocenić. Zauważ, że w tym przypadku wyjątek zostanie zgłoszony, jeśli spróbujesz ustawić wartość A, ponieważ jest ona powiązana z innymi właściwościami, więc nie ma to sensu w tym kontekście.
Te wyrażenia mogą być dość złożone EG a = (b + c) * (d - e)
i mogą zawierać dowolną liczbę właściwości. Interfejs API Fluent jest dość łatwy do odczytania i użycia, ale nie jest tak przyjemny, jak niektóre z interfejsów Fluent API dostarczane przez niektóre biblioteki Microsoft, ale wynika to bardziej z ograniczeń języka Java niż z samego JavaFX.
Między właściwościami tego samego typu można tworzyć proste powiązania dwukierunkowe, tak aby po zaktualizowaniu jednej zmiany automatycznie odzwierciedlała zmianę.
JavaFX udostępnia również interfejs API niskiego poziomu do samodzielnego dostosowywania powiązań, jeśli chcesz utworzyć niestandardowe wyrażenie powiązania, które nie jest dostarczane przez interfejs API lub jeśli obawiasz się o wydajność.
Jedną z największych różnic między JavaFX i WPF jest to, że powiązania są wykonywane głównie w kodzie w JavaFX w porównaniu ze sposobem WPF ustanawiania powiązań w znacznikach.
Wprowadzenie do właściwości i powiązań można znaleźć tutaj .
Style
JavaFX używa CSS do zmiany wyglądu węzłów zawartych na wykresie sceny. Dostępna jest pełna specyfikacja, która wyjaśnia typy i właściwości, które można ustawić w każdym typie węzła.
JavaFX zapewnia również pewne dodatki, które pomagają ulepszyć CSS, takie jak zmienne, które można definiować i używać w innym miejscu, np
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
Zapewnia również kilka funkcji, które pozwalają na uzyskanie kolorów z innych wcześniej zdefiniowanych kolorów, co jest przydatne do tworzenia takich rzeczy, jak gradienty. Oznacza to, że można zdefiniować podstawową paletę kolorów, a resztę można wygenerować na podstawie tych wartości (tak robi domyślny plik JavaFX CSS).
JavaFX CSS nie pozwala na zdefiniowanie typu układu używanego przez węzeł (w chwili pisania tego układu cały układ musi być wykonywany w kodzie). Działa to bardzo dobrze, ponieważ był to jeden aspekt CSS, który naprawdę sprawiał mi ból podczas używania go z HTML.
Osobiście wolę style CSS od XAML, które wydają mi się zbyt szczegółowe jak na mój gust.
Przewodnik po JavaFX CSS można znaleźć tutaj .
Układ
JavaFX udostępnia wiele okienek układu, które są podobne do tych dostarczanych przez WPF. Jedną z różnic, które zauważyłem, jest to, że kontrakt miary i układu jest zdefiniowany na wyższym poziomie łańcucha dziedziczenia w Region
klasie.
Jak wspomniano wcześniej, układ nie może być wykonany za pomocą CSS, ale można go wyrazić za pomocą kodu, FXML lub utworzyć za pomocą konstruktora scen (który jest ostatecznie konwertowany na FXML).
Sterownica
JavaFX zapewnia stale rosnącą bibliotekę elementów sterujących, których oczekujemy. Jedną z głównych różnic między JavaFX i WPF jest to, że formanty są zasadniczo czarnymi skrzynkami i nie można ich ponownie szablonować w taki sposób, jak formanty WPF. Wydają się również uwidaczniać znacznie mniej właściwości niż kontrolki WPF.
Elementy sterujące wystawiają niektóre regiony specyficzne dla implementacji na CSS, umożliwiając kierowanie stylów na określone obszary kontrolki. Nazywa się to podstrukturą sterowania. EG a CheckBox
odsłania dwie podkonstrukcje; pole i znacznik wyboru umożliwiające niezależne stylizowanie każdej części formantu. Należy zauważyć, że jak opisano wcześniej tylko spojrzenie z kontroli mogą być zmieniane za pomocą CSS, ale czuć nie może. EG nie można radykalnie zmienić sposobu, w jaki a TabPane
przedstawia swoją zawartość, zmieniając swój wewnętrzny panel układu w sposób, w jaki można to zrobić z WPF TabControl
.
Chociaż brzmi to dość ograniczająco, preferowanym sposobem tworzenia niestandardowych kontrolek w JavaFX wydaje się być używanie kompozycji zgodnie z wyprowadzeniem z panelu układu do pozycjonowania standardowych kontrolek i zmiany ich stylu za pomocą CSS.
Wniosek
Ogólnie jestem pod ogromnym wrażeniem tego, co w tej chwili ma do zaoferowania JavaFX. Chociaż nie jest tak dojrzałe jak WPF, jest aktywnie rozwijane i Oracle z pewnością wydaje się to wspierać. Czas pokaże, czy się powiedzie, czy nie.
Poleciłbym wypróbować JavaFX. Przeczytaj dokumentację i spróbuj złożyć małą aplikację i zobacz, co myślisz.
Powinieneś także sprawdzić FXExperience.com, który jest regularnie aktualizowany informacjami od zespołu programistów.