Frameworki Java GUI. Co wybrać Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot? [Zamknięte]

228

Istnieje wiele frameworków GUI dla java, ale co uznaje się za dzisiejszy wybór ram?

Oto moje rozumienie różnych ram, proszę mnie poprawić, jeśli się mylę. Jest to bardzo luźno zdefiniowany zestaw pytań, ale nadal uważam, że jest cenny dla każdego, kto myśli o tworzeniu bogatych aplikacji GUI.


AWT

Jest to podstawa swingu, działa dobrze, ale brakuje mu zaawansowanych komponentów. Jeśli zamierzasz tworzyć bogate aplikacje, AWT prawdopodobnie nie jest dobrym rozwiązaniem. Jednak w przypadku mniejszych aplikacji GUI, które nie wymagają bogatych interfejsów użytkownika. Może to idealnie pasować, ponieważ jest to wypróbowana i sprawdzona platforma.


Huśtawka

Na podstawie AWT, jak stwierdzono wcześniej. W początkowym okresie był uważany za powolny i błędny i spowodował, że IBM stworzył SWT dla Eclipse. Jednak w Javie 5 (lub 6?) Swing stał się preferowanym narzędziem do tworzenia nowych aplikacji. Huśtawka ma wiele bogatych komponentów, ale wciąż brakuje jej w niektórych obszarach. Jednym z przykładów jest to, że nie ma w pełni funkcjonalnego komponentu TreeTable, który mógłby sortować i filtrować / wyszukiwać.


SWT

Stworzone przez IBM dla Eclipse, wydawało im się, że Swing nie był wtedy odpowiedni dla Eclipse. Sam w sobie jest dość niskim poziomem i korzysta z natywnych widgetów platformy za pośrednictwem JNI. Nie ma to wcale związku z Swingiem i AWT. Ich interfejs API jest jednak nieco niezręczny i nie intuicyjny. Mają pewne zaawansowane komponenty, takie jak TreeTable. (ale nie sądzę, że obsługują sortowanie i filtrowanie po wyjęciu z pudełka). SWT korzysta z niektórych rodzimych powiązań (przez JNI?), A w Internecie istnieje rant, że nie należy używać tych ram w dzisiejszych projektach. (Dlaczego nie?)


SwingX

Oparty na Swing, a jego misją jest tworzenie bogatych komponentów do swing. Wciąż w fazie rozwoju. (niezbyt aktywne). Mają bardzo ładny zestaw komponentów, takich jak na przykład TreeTable. Ale TreeTable nie obsługuje filtrowania i sortowania, o ile wiem. Obsługuje jednak wyszukiwanie z podświetlaniem.

Zauważ, że SwingX to komponenty (AFAIU), które są rozszerzeniami lub kompozycjami istniejących komponentów Swing


JGoodies

Ramy, o których nic nie wiem ... Jakie są mocne i słabe strony? Jaki zestaw Jgoodies oprócz reszty?

JGoodies OTOH dotyczy PLAF i układów.


JavaFX

Najnowszy flagowy produkt Java / Oracle. obiecując, że stanie się faktycznym standardem w tworzeniu bogatych aplikacji komputerowych lub internetowych.


Pivot Apache

Renderuje interfejs użytkownika za pomocą Java2D, minimalizując w ten sposób wpływ (IMO, wzdęty) dziedzictwo Swinga i AWT. (@Augustus Thoo)

Wydaje się, że koncentruje się głównie na RIA (bogate aplikacje internetowe), ale wydaje się, że można go również zastosować do aplikacji komputerowych. I jako osobisty komentarz, wygląda bardzo interesująco! Szczególnie podoba mi się to, że jest to projekt apache.

https://cwiki.apache.org/PIVOT/frequently-asked-questions-faq.html


Qt Jambi

Opakowanie java do natywnej biblioteki qt napisanej w c / c ++. Bardzo potężny, szeroko stosowany i akceptowany. Ma wiele komponentów GUI i łatwy w użyciu interfejs API.

http://qt-jambi.org/


Więc, aby podsumować trochę tego, o co proszę:

Powiedzmy, że chciałem dziś stworzyć aplikację komputerową w Javie, która zawiera wiele zaawansowanych komponentów, co powinienem wybrać? I dlaczego?

Który z tych ram należy uznać za przestarzały, a który jako ramy odległej przyszłości?

Co to jest dzisiejszy de facto standardowy framework i jakich narzędzi używasz do tworzenia aplikacji GUI Java?


Żałuję, że o to pytam, ale i tak spróbuję:

Mówi się, że C # /. Net ma bardzo dobry zestaw łatwych w użyciu komponentów, które można wyginać w każdym możliwym kierunku. Po zbadaniu różnych frameworków Java do pewnego stopnia nie mogę powiedzieć tego samego o Javie. Dlaczego to? Dlaczego java (który jest najczęściej używanym językiem programowania na świecie) nie ma tego samego zestawu komponentów GUI?

Czy to po prostu, że Java oparła komponenty GUI na znacznie niższym poziomie i można napisać te wszystkie zaawansowane komponenty, których szukam, ale sam musisz wykonać wiele, jeśli nie całą pracę?

netbrain
źródło
Nie wiedziałem, że SWT jest „oparty na kombinacji AWT i Swing”. Czy to naprawdę tak jest? Myślałem, że to czysty JNI przywołać system okienkowy systemu operacyjnego ...
Rich
@Rich Och, powiedziano w komentarzu do jednej z odpowiedzi. Po prostu założyłem, że wiedzą o czym mówią.
netbrain
4
Myślę, że mylisz „UI Toolkit” i „framework GUI”. AWT, Swing i SWT to zestawy narzędzi interfejsu użytkownika, ale z pewnością nie nazwałbym ich „frameworkami”. Szkielety są oparte na danym zestawie narzędzi interfejsu użytkownika i zapewniają klej do zbudowania aplikacji. Najpierw powinieneś wybrać zestaw narzędzi interfejsu użytkownika, a następnie wybrać środowisko, które działa na tym zestawie narzędzi. FWIW, wybrałbym Swinga z moim własnym szkieletem Guts-GUI :-)
jfpoilpret
1
Prawie zawsze jest to Swing vs. SWT (przynajmniej dla mnie), dla małego porównania możesz sprawdzić Jakie są główne rzeczy, o których powinien wiedzieć doświadczony programista Java SWT, przechodząc do Swing? ..
Sorceror,
2
JavaFX nie jest już częścią podglądu SDK i jest dostępny do użytku produkcyjnego. zaktualizuj ten post.

Odpowiedzi:

79

Drzewo decyzyjne:

  1. Struktury takie jak Qt i SWT wymagają natywnych bibliotek DLL. Musisz więc zadać sobie pytanie: czy obsługiwane są wszystkie niezbędne platformy? Czy możesz spakować natywne biblioteki DLL za pomocą aplikacji?

    Zobacz tutaj, jak to zrobić dla SWT .

    Jeśli masz tutaj wybór, powinieneś preferować Qt niż SWT. Qt został opracowany przez ludzi, którzy rozumieją interfejs użytkownika i pulpit, podczas gdy SWT został opracowany z konieczności przyspieszenia Eclipse. To bardziej poprawka wydajności dla Java 1.4 niż struktura interfejsu użytkownika. Bez JFace brakuje wielu głównych składników interfejsu użytkownika lub bardzo ważnych funkcji składników interfejsu użytkownika (takich jak filtrowanie w tabelach).

    Jeśli SWT brakuje potrzebnej funkcji, środowisko jest nieco wrogo nastawione do jego rozszerzania. Na przykład nie można rozszerzyć w niej żadnej klasy (klasy nie są końcowe, po prostu rzucają wyjątki, gdy pakiet this.getClass()nie jest org.eclipse.swti nie można dodawać nowych klas w tym pakiecie, ponieważ jest podpisany).

  2. Jeśli potrzebujesz natywnego, czystego rozwiązania Java, pozostawiasz resztę. Zacznijmy od AWT, Swing, SwingX - sposób Swing.

    AWT jest przestarzały. Swing jest przestarzały (może mniej, ale przez ostatnie 10 lat nie wykonano wiele pracy na Swing). Można argumentować, że Swing był dobry na początek, ale wszyscy wiemy, że zgniły kod. Dotyczy to szczególnie dzisiejszych interfejsów użytkownika.

    To pozostawia Ci SwingX. Po dłuższym okresie powolnych postępów rozwój ponownie przyspieszył . Główną wadą Swinga jest to, że opiera się on na starych pomysłach, które 15 lat temu bardzo krwawiły, ale które dziś wydają się „niezdarne”. Na przykład widoki tabel obsługują filtrowanie i sortowanie, ale nadal musisz to skonfigurować. Musisz napisać dużo kodu płyty kotła, aby uzyskać przyzwoity interfejs użytkownika, który wydaje się nowoczesny.

    Kolejnym słabym obszarem jest temat. Na dzień dzisiejszy istnieje wiele tematów. Zobacz tutaj, aby znaleźć 10 najlepszych . Ale niektóre są powolne, niektóre są błędne, inne są niekompletne. Nienawidzę tego, gdy piszę interfejs użytkownika, a użytkownicy narzekają, że coś dla nich nie działa, ponieważ wybrali dziwny motyw.

  3. JGoodies to kolejna warstwa na Swing, podobnie jak SwingX. Stara się, aby Swing był przyjemniejszy w użyciu. Strona wygląda świetnie. Rzućmy okiem na samouczek ... hm ... wciąż szukam ... poczekaj. Wygląda na to, że na stronie nie ma żadnej dokumentacji. Google na ratunek . Nie, żadnych przydatnych samouczków.

    Nie czuję się pewnie z frameworkiem interfejsu użytkownika, który tak bardzo stara się ukryć dokumentację przed potencjalnymi nowymi fanami. To nie znaczy, że JGoodies jest zły; Po prostu nie mogłem znaleźć nic dobrego do powiedzenia na ten temat, ale ładnie to wygląda.

  4. JavaFX. Świetnie, stylowo. Wsparcie jest dostępne, ale uważam, że jest to bardziej błyszcząca zabawka niż poważna platforma interfejsu użytkownika. To uczucie wynika z braku złożonych elementów interfejsu użytkownika, takich jak tabele drzew. Istnieje składnik oparty na pakiecie webkit do wyświetlania HTML .

    Kiedy został wprowadzony, moją pierwszą myślą było „pięć lat za późno”. Jeśli Twoim celem jest fajna aplikacja na telefony lub strony internetowe, dobrze. Jeśli Twoim celem jest profesjonalna aplikacja komputerowa, upewnij się, że dostarcza to, czego potrzebujesz.

  5. Sworzeń. Pierwszy raz o tym słyszałem. Zasadniczo jest to nowa platforma interfejsu użytkownika oparta na Java2D. Więc spróbowałem wczoraj. No Swing, tylko odrobina AWT ( new Font(...)).

    Moje pierwsze wrażenie było miłe. Istnieje obszerna dokumentacja, która pomaga w rozpoczęciu pracy. Większość przykładów zawiera dema na żywo (uwaga: Java musi być włączona w przeglądarce internetowej; jest to zagrożenie bezpieczeństwa ) na stronie internetowej, aby można było zobaczyć kod i wynikową aplikację obok siebie.

    Z mojego doświadczenia wynika, że ​​więcej wysiłku wymaga kod niż dokumentacja. Patrząc na dokumenty Pivot, wiele wysiłku musiało zostać włożone w kod. Zauważ, że obecnie występuje błąd, który uniemożliwia działanie niektórych przykładów ( PIVOT-858 ) w przeglądarce.

    Moje drugie wrażenie Pivot jest takie, że jest łatwy w użyciu. Kiedy napotkałem problem, zwykle mogłem go szybko rozwiązać, patrząc na przykład. Brakuje jednak odniesienia do wszystkich stylów obsługiwanych przez każdy komponent.

    Podobnie jak w JavaFX, brakuje niektórych komponentów wyższego poziomu, takich jak komponent tabeli drzew ( PIVOT-306 ). Nie próbowałem leniwego ładowania z widokiem tabeli. Mam wrażenie, że jeśli model bazowy używa leniwego ładowania, to wystarczy.

    Obiecujący. Jeśli możesz, spróbuj.

Aaron Digulla
źródło
Wypróbowana wersja demo „Zlew kuchenny”, po otwarciu niektórych grup nadal zjada cały procesor. Jeśli wynika to z projektu Pivot, to zdecydowanie nie chcę tego w moich projektach.
Wyświetl nazwę
Wygląda na to, że znalazłem źródło problemu i zostało to naprawione w późniejszych wersjach: apache-pivot-users.399431.n3.nabble.com/…
Nazwa wyświetlana
2
JavaFX 8 (dla Java 8 i nowszych) ma widget TreeTableView. Jednak JavaFX 2.2 (dla Java 7) nie ma tego, a także brakuje standardowych komunikatów błędu i informacji: patrz stackoverflow.com/a/12760202/105137 . Biblioteka widżetów ControlsFX jest dostępna tylko dla Java 8: fxexperience.com/controlsfx
kostmo
12

SWT sam w sobie jest dość niskim poziomem i korzysta z natywnych widgetów platformy za pośrednictwem JNI. Nie ma to wcale związku z Swingiem i AWT. Eclipse IDE i wszystkie oparte na Eclipse Rich Client Applications, takie jak klient Vuze BitTorrent , są budowane przy użyciu SWT. Ponadto, jeśli opracowujesz wtyczki Eclipse, zwykle używasz SWT.
Tworzę aplikacje i wtyczki oparte na Eclipse od prawie 5 lat, więc jestem wyraźnie stronniczy. Mam jednak również duże doświadczenie w pracy z SWT i zestawem narzędzi JFace UI, który jest zbudowany na nim. Odkryłem, że JFace jest bardzo bogaty i potężny; w niektórych przypadkach może to być nawet główny powód wyboru SWT. Umożliwia dość szybkie poprawienie działającego interfejsu użytkownika, o ile jest on podobny do IDE (z tabelami, drzewami, natywnymi kontrolkami itp.). Oczywiście możesz również zintegrować niestandardowe elementy sterujące, ale wymaga to dodatkowego wysiłku.

Zsolt Török
źródło
Czy Twoim zdaniem zaawansowany komponent, taki jak TreeTable z sortowaniem i filtrowaniem kolumn, byłby dużym problemem w SWT + JFace?
netbrain
@netbrain: Robiłem to wiele razy, dzięki JFace jest to dość proste. Mam na myśli interfejs „podobny do IDE”, może nie najlepszy wybór słów.
Zsolt Török
9

Chciałbym zasugerować inny framework: Apache Pivot http://pivot.apache.org/ .

Wypróbowałem to krótko i byłem pod wrażeniem tego, co może zaoferować jako środowisko RIA (Rich Internet Application) ala Flash.

Renderuje interfejs użytkownika za pomocą Java2D, minimalizując w ten sposób wpływ (IMO, wzdęty) dziedzictwo Swinga i AWT.

Augustus Thoo
źródło
1
Miałem wrażenie, że Netbrain pyta o aplikacje komputerowe. W przypadku ram RIA rozważ również GWT i Vaadin. Te frameworki pozwalają pisać w Javie, kompilować i uzyskiwać JavaScript, który działa bardzo dobrze we wszystkich popularnych przeglądarkach internetowych.
Costis Aivalis,
nie można zastosować osi przestawnej do aplikacji komputerowych?
netbrain
Być może jest to kwestia definicji, ale frameworki RIA są w zasadzie zaprojektowane do działania w przeglądarkach.
Costis Aivalis
2
@netbrain: Tak, możesz uruchomić Pivot jako aplikację komputerową (JFrame) lub aplet (JApplet).
Augustus Thoo,
9

Swing + SwingX + Miglayout to moja kombinacja. Miglayout jest o wiele prostszy niż Swings postrzegał 200 różnych menedżerów układu i jest znacznie potężniejszy. Zapewnia również możliwość „debugowania” układów, co jest szczególnie przydatne podczas tworzenia złożonych układów.

helpermethod
źródło
8

Inną opcją jest użycie Qt Jambi . Ma prawie całą wielkość Qt (wiele komponentów, dobra dokumentacja, łatwa w użyciu), bez kłopotów z C ++. Użyłem go 3-4 lata temu do małego projektu, nawet wtedy był już prawie dojrzały.

Może chcesz zobaczyć dyskusję o Swing vs Qt tutaj .

nimcap
źródło
5

Moja osobista opinia: wybierz Swing razem z platformą NetBeans.

Jeśli potrzebujesz zaawansowanych komponentów (więcej niż oferuje NetBeans), możesz łatwo zintegrować SwingX bez problemów (lub JGoodies), ponieważ platforma NetBeans jest całkowicie oparta na Swing.

Nie uruchomiłbym dużej aplikacji komputerowej (lub takiej, która będzie duża) bez dobrej platformy opartej na podstawowej strukturze interfejsu użytkownika.

Inną opcją jest SWT wraz z Eclipse RCP, ale trudniej (choć nie jest to niemożliwe) zintegrować „czyste” komponenty Swing z taką aplikacją.

Krzywa uczenia się jest nieco stroma dla platformy NetBeans (choć myślę, że dotyczy to również Eclipse), ale jest kilka dobrych książek, wokół których bardzo polecam.

koń bez imienia
źródło
1
Zauważ, że SwingX to komponenty (AFAIU), które są rozszerzeniami lub kompozycjami istniejących komponentów Swing. JGoodies OTOH dotyczy PLAF i układów. Ale, jak powiedziałeś, albo zintegruje się płynnie z Swing.
Andrew Thompson,
1
+1 Oprzyj swój rozwój na Swing. Swing jest zbudowany na AWT i zawiera lekkie komponenty, które wyglądają i zachowują się tak samo na wszystkich platformach, więc nigdy nie należy używać komponentów AWT bezpośrednio. Istnieje wiele doskonałych ziaren, które można łatwo dodać do GUI programistycznego, np. Toedter.com JCalendar.
Costis Aivalis,
1
@Andrew oprócz PLAF i układu, JGoodies oferuje więcej: wiązanie ziaren (dla wzorca modelu prezentacji), sprawdzanie poprawności i strukturę „JSR-296” (ta jest komercyjna).
jfpoilpret
3

zapomniałeś aplikacji Java Desktop Aplication opartej na JSR296 jako wbudowanej Swing Framework w NetBeans

wyłączając AWT i JavaFX, wszystkie opisane frameworki oparte są na Swing, jeśli zaczniesz od Swinga, zrozumiesz (wyraźnie) dla wszystkich tych Swingów (oparte na frameworku)

ATW, SWT (Eclipse), Java Desktop Aplication (Netbeans), SwingX, JGoodies

wszystkie tam frameworki (nie wiem nic więcej o JGoodies), w tym. JavaFX od dawna nie odnotowuje żadnych postępów, wiele frameworków Swinga jest zatrzymywanych, jeśli nie bez najnowszej wersji

tylko mój pogląd - najlepszy z nich to SwingX, ale wymagał najgłębszej wiedzy o Swing,

Szukaj i zobacz frameworki Swing

mKorbel
źródło
część z nich na komponentach AWT, część na Swing JCompoentns, ale między AWT i Swing jest różnica z zaimplementowanymi, dostępnymi i dziedziczącymi metodami, na przykład Swing JComponents bezpośrednio (API) implementuje wiele metod dziedziczenia lub zagnieżdżania bezpośrednio z AWT :-)
mKorbel
JSR296 nie żyje. Nie jest już „utrzymywany”, a wsparcie dla niego zostało usunięte z NetBeans. (I nigdy nie było to naprawdę dobre ramy)
a_horse_with_no_name
@a_horse_w_na_nazwie, która bezpośrednio with same progressw SWT, SwingX, nowy właściciel, nowi manier
mKorbel
1
SWT, opracowany przez IBM, nie jest oparty na Swing, jest / był konkurencyjną technologią. Huśtawka używa AWT. JavaFX nie jest również oparty na Swing. To zupełnie nowe ramy. Niektórzy nazywają go następcą Swinga, ale wciąż jest zbyt niedojrzały, by nazwać tę bitwę. W tej chwili podejmuję dokładnie taką samą decyzję, a Swing jest moim kandydatem, po prostu dlatego, że jest to najbardziej dojrzała, ale realistyczna opcja dostępna.
Gordon
1
SwingX jest rozszerzeniem Swing (dlatego wymaga wiedzy Swing), w rzeczywistości niektóre funkcje SwingX zostały wprowadzone do samego Swinga.
Gordon
3

Byłem całkiem zadowolony ze Swinga dla aplikacji komputerowych, w które byłem zaangażowany. Podzielam jednak twój pogląd na to, że Swing nie oferuje zaawansowanych komponentów. W tych przypadkach wybrałem JIDE. To nie jest darmowe, ale też nie tak drogie i daje o wiele więcej narzędzi pod pasem. W szczególności oferują filtrowalne TreeTable.

sbrattla
źródło
Dobrze wiedzieć! Więc JIDE stworzył własne komponenty oparte na Swing ...
netbrain
Tak, JIDE wykonał sporo elementów obejmujących siatki, drzewa, tabele, wykresy i tym podobne. Tak jak powiedziałem, nie jest to darmowe, ale biorąc pod uwagę czas, jaki zajęłoby zrobienie tych rzeczy samemu, prawdopodobnie lepiej byłoby użyć czegoś, co już zostało wykonane. Ponadto, o ile rozumiem, JIDE jest elastyczny, jeśli chodzi o pozwolenie, aby projekty open source korzystały z ich komponentów w zamian za link do swojej strony internetowej lub logo w oknie dialogowym „O mnie”.
sbrattla,
3

Poszedłbym z Swingiem. Do układu użyłbym układu formularza JGoodies. Warto przestudiować białą księgę na temat układu formularza tutaj - http://www.jgoodies.com/freeware/forms/

Również, jeśli zamierzasz rozpocząć tworzenie ogromnej aplikacji komputerowej, na pewno potrzebujesz frameworka. Inni zwrócili uwagę na strukturę netbeans. Nie podobało mi się to, więc napisałem nowy, którego używamy teraz w mojej firmie. Umieściłem go na sourceforge, ale nie znalazłem czasu, żeby to dużo dokumentować. Oto link do przeglądania kodu:

http://swingobj.svn.sourceforge.net/viewvc/swingobj/

Prezentacja powinna pokazać, jak wykonać proste logowanie.

Daj mi znać, jeśli masz jakieś pytania, w czym mógłbym pomóc.

sethu
źródło