Jak wypada JavaFX w porównaniu z WPF? [Zamknięte]

94

Jestem głównie programistą C #, przestałem pisać Javę około 10 lat temu, ale staram się nadążać za technologią w Javie czytając artykuły, rozmawiając ze znajomymi itp.

Słyszałem o nowym bogatym frameworku GUI o nazwie JavaFX, ale nie mogłem znaleźć żadnego zasobu porównującego go z odpowiednikami innymi niż Java.

Ponieważ bardzo dobrze znam C # i WPF, chciałbym się zorientować, jak podobne lub różne są te dwie technologie.

EDYCJA: Ponieważ nie ma odpowiedzi, postaram się być bardziej szczegółowy:

  1. WPF używa XAML do tworzenia drzewa wizualnego, czy JavaFX ma coś podobnego?
  2. WPF jest najlepiej używany z powiązaniem z modelem widoku we wzorcu MVVM, czy JavaFX również intensywnie wykorzystuje powiązanie?
  3. WPF wykorzystuje GPU do renderowania, czy JavaFX robi to samo?
  4. Jak Silverlight wypada w porównaniu z JavaFX, gdy jest uruchamiany przez przeglądarkę na komputerze sieciowym?

... Więcej w przyszłości...

Zmieniam to na wiki społeczności, aby porównania mogły być aktualizowane (miejmy nadzieję).

Aviad P.
źródło
7
Zabawne, że pytanie z 83 głosami pozytywnymi można uznać za nie konstruktywne.
kristianp

Odpowiedzi:

121

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 Regionklasie.

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 CheckBoxodsł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 TabPaneprzedstawia 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.

Benjamin
źródło
9
Wielkie dzięki za to, to jest bardzo pouczające. Byłoby wspaniale, gdybyś mógł dalej udoskonalić tę odpowiedź w miarę pogłębiania swojej wiedzy o JavaFX.
Aviad P.
5
Z przyjemnością przeczytałem również Twoją odpowiedź i chciałbym dowiedzieć się więcej, jeśli Twoja praca z JavaFX ujawni dalsze spostrzeżenia.
Paul-Sebastian Manole,
21

Myślę, że najlepszym sposobem na poznanie JavaFX jest po prostu jego wypróbowanie. W witrynie JavaFX znajduje się kilka dobrych samouczków. Oto kilka:

Są dość szybkie i dają dobre wyczucie języka. W witrynie JavaFX jest wiele innych, jeśli jesteś zainteresowany dodatkowymi samouczkami i artykułami.

Aby uzyskać szczegółowe odpowiedzi na Twoje pytania:

  1. JavaFX ma swój własny deklaratywny język do tworzenia „drzewa wizualnego”, które nie jest pochodną XML. Interfejs użytkownika jest oparty na wykresie sceny, dzięki czemu można zastosować różne efekty i animacje do dowolnego węzła na wykresie. Zobacz samouczki, aby uzyskać więcej informacji. Istnieje również narzędzie do projektowania dla JavaFX (którego jeszcze nie wypróbowałem).
  2. JavaFX ma powiązanie wbudowane w język .
  3. JavaFX na pulpicie korzysta z Java AWT / Swing, która korzysta z renderowania GPU. Wydaje się, że każda wersja Javy przenosi więcej swojej grafiki na GPU. Chris Campbell z firmy Sun zamieścił na blogu kilka informacji na temat przyspieszania GPU . Nie jestem pewien, czy mobilna wersja JavaFX ma akcelerację GPU. Zauważyłem, że wcześniejsze wersje JavaFX nie były wystarczająco wydajne dla tego, czego potrzebowałem, ale wiem, że najnowsza wersja ma znaczną poprawę wydajności w porównaniu z poprzednimi wersjami i nadal pracują nad jej przyspieszeniem.
  4. JavaFx używa apletów Java do uruchamiania w przeglądarce. Począwszy od aktualizacji 10 Java 6, struktura apletów Java została przeprojektowana i chociaż nie jest tak płynna jak Adobe Flash, jest znacznie ulepszona. Nie jestem pewien, jak wypada to w porównaniu z Silverlight, poza tym, że miałem problemy z uruchomieniem Silverlight w systemie Linux, ale JavaFX działał w systemie Linux.

Oto kolejne powiązane pytanie .

Jay Askren
źródło
15
Ta odpowiedź jest nieaktualna, ponieważ JavaFX przeszedł znaczące aktualizacje w Javie 7. Zobacz tutaj .
Zoltán
7
Czy jesteś pewien, że JavaFX używa swing i AWT? Myślę, że ma swój własny silnik renderujący zwany pryzmatem. Podczas uruchamiania aplikacji JavaFX nie jest tworzony wątek wysyłania zdarzeń.
Andy Do