Aplikacja Java Desktop: SWT vs. Swing [zamknięte]

158

Na co dzień jestem programistą WWW i myślę o stworzeniu mojej pierwszej prawdziwej aplikacji komputerowej. Chodzi o to, aby zbudować narzędzie, które automatyzuje bardzo powtarzalne zadanie w aplikacji internetowej, w której nie jest dostępny interfejs API.

Wiem, że chcę używać Javy. Używałem go wcześniej do rzeczy internetowych, znam całkiem dobrze składnię i chcę, aby aplikacja była tak łatwa, jak to tylko możliwe.

Nie jestem pewien, czy powinienem używać SWT czy Swing. Ponieważ moi główni odbiorcy korzystają z systemu Windows, chcę tam wyglądać jak najbardziej natywnie. Linux i Mac powinny działać, ale wygląd nie jest tutaj ważny.

Jakie są więc argumenty za i przeciw każdej strukturze UI, Swingowi lub SWT?

Dzięki.

PS: Tworzę na Windowsie używając Eclipse. Ale myślałem o zabawie z Netbeans.

janpio
źródło
Trudne pytanie. :-) Poszedłbym z Swingiem. Ale nie miej żadnych PRO ani CON dla tej decyzji.
Pablo Santa Cruz
duplikat Q. proszę poszukać Swing vs. SWT Q's zadane już na SO. FWIW, używam Swinga tylko dlatego, że się tego nauczyłem. Istnieją natywne biblioteki wyglądające i działające (patrz jgoodies looki)
Jason S,
„zbudować narzędzie, które automatyzuje bardzo powtarzalne zadanie w aplikacji internetowej” - jakieś informacje na ten temat? Może już istnieć narzędzie - i kwestionuję potrzebę zautomatyzowania tego za pomocą aplikacji komputerowej - może teraz działać w Twoim przypadku - ale co, jeśli przejdziesz na rozwiązanie hostowane?
Nate
Nie musisz uczyć się struktury GUI dla aplikacji komputerowej. Jeśli możesz używać html css i js (którym, jak zakładam, jesteś), możesz użyć Electron do tworzenia natywnych aplikacji z językami internetowymi.
Pranav A.,
Electron został wynaleziony kilka lat po tym, jak zadałem to pytanie;) Ale oczywiście dzisiaj masz rację.
janpio,

Odpowiedzi:

152

Plusy Swing:

  • część biblioteki java, nie ma potrzeby stosowania dodatkowych bibliotek natywnych
  • działa tak samo na wszystkich platformach
  • Zintegrowany edytor GUI w Netbeans i Eclipse
  • dobre samouczki online autorstwa Sun / Oracle
  • Obsługiwane przez oficjalne rozszerzenia Java (takie jak java OpenGL)

Wady Swing:

  • Natywny wygląd i styl mogą zachowywać się inaczej niż prawdziwy system natywny.
  • ciężkie komponenty (natywne / awt) ukrywają komponenty huśtawki, nie jest to problem przez większość czasu, ponieważ użycie ciężkich komponentów jest raczej rzadkie

Plusy SWT:

  • używa natywnych elementów, gdy jest to możliwe, więc zawsze natywne zachowanie
  • obsługiwane przez eclipse, edytor GUI VEP (VEP obsługuje również Swing i AWT)
  • duża liczba przykładów w Internecie
  • posiada zintegrowany mostek AWT / SWT, aby umożliwić korzystanie z komponentów awt i swing

Wady SWT:

  • wymaga natywnych bibliotek dla każdego obsługiwanego systemu
  • może nie obsługiwać każdego zachowania we wszystkich systemach ze względu na używane zasoby natywne (opcje podpowiedzi)
  • zarządzanie zasobami natywnymi, podczas gdy komponenty natywne są często usuwane wraz z ich nadrzędnymi zasobami, inne zasoby, takie jak czcionki, muszą być ręcznie zwalniane lub rejestrowane jako odbiornik usuwania do składnika w celu automatycznego zwolnienia.
josefx
źródło
33
Swing będzie bliżej "napisz raz, uruchom gdziekolwiek". SWT będzie bardziej jak „napisz raz, poprawiaj / testuj wszędzie”. Ale ta sama dyskusja miała miejsce również w przypadku innych języków.
Mark
12
Realistycznie, "natywny" wygląd i styl Swinga zachowuje się znacznie inaczej niż mój pulpit Gnome - podczas gdy z jakiegoś powodu motywy działają całkiem dobrze, menu wyglądają okropnie i są prawie bezużyteczne.
Hut8
9
Począwszy od Eclipse 3.7, VEP został zastąpiony przez WindowBuilder (który obsługuje również Swing i SWT).
Alexey Romanov
6
Zaletą SWT jest również mniejsze zużycie pamięci ze względu na natywne komponenty. Powinno to być pożądane na maszynach z ograniczoną pamięcią, a różnice w pamięci między swing i swt mogą być duże w dużych projektach GUI.
jantobola
1
@JanTobola To po prostu źle. Komponenty natywne używają pamięci przydzielonej na stercie rodzimej, a nie tylko na stercie Java. Pracowałem nad dużymi GUI przy użyciu platformy Netbeans, Eclipse RCP, SWT i Swing. Były poważne obawy dotyczące zużycia pamięci w Swing w bardzo wczesnych wersjach Java (kiedy była to biblioteka innej firmy, a później także od 1.1 do 1.2? ), ale nie jest to już prawdą i to od deweloperów zależy uwolnienie dużej ilości zasobów w SWT, istnieje znacznie więcej możliwości wycieku pamięci z SWT, podczas gdy komponent, do którego nie ma odniesień, zostaje „usunięty” przez Swing.
gouessej
63

Ważną rzeczą do rozważenia jest to, że niektórzy użytkownicy i niektórzy sprzedawcy (Dell) instalują 64-bitową maszynę wirtualną na swoich 64-bitowych systemach Windows i nie można używać tej samej biblioteki SWT na 32-bitowych i 64-bitowych maszynach wirtualnych.

Oznacza to, że będziesz musiał dystrybuować i testować różne pakiety w zależności od tego, czy użytkownicy mają 32-bitową, czy 64-bitową maszynę wirtualną Java. Zobacz ten problem na przykład z Azureusem, ale masz go również z Eclipse, gdzie na dzień dzisiejszy kompilacje na pierwszej stronie pobierania nie działają na 64-bitowej maszynie wirtualnej.

Ludovico Fischer
źródło
2
Ciekawy punkt. Jako użytkownik nadal jestem zdumiony, dlaczego to taka wielka sprawa. Ale cóż, tak jest, więc będę musiał to rozważyć. Dzięki.
janpio
btw: javaws (webstart) nie jest dostępny dla 64 IMHO
Karussell
1
@Karussell: Od 3 kwietnia 2011 r. 64-bitowa maszyna JVM firmy Sun dla systemu Windows obsługuje technologię JNLP. Myślę, że to prawda przez jakiś czas, ale nie jestem pewien, jak długo.
The Alchemist
23

huśtawka pro:

  • Największą zaletą swing IMHO jest to, że nie musisz wysyłać bibliotek ze swoją aplikacją (co pozwala uniknąć dziesiątek MB (!)).
  • Natywny wygląd i styl są znacznie lepsze do huśtania niż we wczesnych latach
  • wydajność jest porównywalna do swt (swing nie jest wolny!)
  • NetBeans oferuje Matisse jako wygodny kreator komponentów.
  • Integracja komponentów Swing z JavaFX jest łatwiejsza.

Ale na koniec nie sugerowałbym używania „czystego” swing lub swt ;-) Istnieje kilka frameworków aplikacji do swing / swt out. Spójrz tutaj . Największymi graczami są netbeans (swing) i eclipse (swt). Innym fajnym szkieletem może być griffon, a fajnym „zestawem komponentów” jest pivot (swing). Griffon jest bardzo interesujący, ponieważ integruje wiele bibliotek, a nie tylko swing ; również pivot, swt itp

Karussell
źródło
1
Tak, NetBeans ma Matisse'a jako kreatora GUI, ale kod jest naprawdę rozwlekły, mylący do odczytania i prawie niemożliwy do edycji przez kod źródłowy. Jeśli naprawdę chcesz budować GUI, idź z zaćmieniami WindowBuilder
Pranav A.
13

Używałbym Swinga z kilku powodów.

  • Jest na rynku dłużej i poświęcono mu więcej wysiłku rozwojowego. W związku z tym jest prawdopodobnie bardziej kompletna i (być może) ma mniej błędów.

  • Istnieje wiele dokumentacji i innych wskazówek dotyczących tworzenia wydajnych aplikacji.

  • Wygląda na to, że zmiany w Swing rozprzestrzeniają się na wszystkie platformy jednocześnie, podczas gdy zmiany w SWT pojawiają się najpierw w systemie Windows, a następnie w Linuksie.

Jeśli chcesz zbudować bardzo bogatą w funkcje aplikację, możesz sprawdzić NetBeans RCP (Rich Client Platform). Jest krzywa uczenia się, ale dzięki niewielkiej praktyce możesz szybko stworzyć fajne aplikacje. Nie mam wystarczającego doświadczenia z platformą Eclipse, aby dokonać prawidłowej oceny.

Jeśli nie chcesz używać całego RCP, NetBeans ma również wiele przydatnych komponentów, które można wyciągnąć i używać niezależnie.

Jeszcze jedna rada: przyjrzyj się różnym menedżerom układów. Podkręciły mnie na długi czas, kiedy się uczyłem. Niektórych z najlepszych nie ma nawet w standardowej bibliotece. MigLayout (zarówno Swing i SWT) i JGoodies Formy narzędzi są dwie z najlepszych moim zdaniem.

clartaq
źródło
10

Wybrałbym swing tylko dlatego, że jest „natywny” dla Java.

Ponadto spójrz na http://swingx.java.net/ .

wyzerowane
źródło
1
Link jest uszkodzony!
Sokrates
8

Dla twoich wymagań wydaje się, że najważniejsze będzie użycie Swinga, ponieważ jest nieco łatwiejszy do rozpoczęcia i nie jest tak ściśle zintegrowany z natywną platformą jak SWT.

Swing jest zwykle bezpiecznym zakładem.

Yuval Adam
źródło
6

Interesujące pytanie. Nie znam SWT zbyt dobrze, żeby się nim chwalić (w przeciwieństwie do Swing i AWT), ale oto porównanie zrobione na SWT / Swing / AWT.

http://www.developer.com/java/other/article.php/10936_2179061_2/Swing-and-SWT-A-Tale-of-Two-Java-GUI-Libraries.htm

A oto strona, na której można pobrać samouczek dotyczący praktycznie wszystkiego na SWT ( http://www.java2s.com/Tutorial/Java/0280__SWT/Catalog0280__SWT.htm )

Mam nadzieję, że podejmiesz właściwą decyzję (jeśli są dobre decyzje w kodowaniu) ... :-)

Buhake Sindi
źródło
4
Ale zwróćcie uwagę, że artykuł pochodzi z 2003 roku ...
Alexey Romanov
4

Jeśli planujesz zbudować w pełni funkcjonalne aplikacje z więcej niż kilkoma funkcjami, zasugeruję od razu użycie Eclipse RCP jako ramy.

Jeśli Twoja aplikacja nie będzie zbyt duża lub Twoje wymagania są zbyt wyjątkowe, aby mogły być obsługiwane przez normalne środowisko biznesowe, możesz bezpiecznie przejść z Swing.

Pod koniec dnia proponuję wypróbować obie technologie, aby znaleźć tę, która bardziej Ci odpowiada. Podobnie jak Netbeans vs Eclipse vs IntelliJ, nie ma tutaj absolutnie poprawnej odpowiedzi, a oba frameworki mają swoje wady.

Pro Swing:

  • więcej ekspertów
  • bardziej podobne do Javy (prawie nie ma pola publicznego, nie ma potrzeby usuwania zasobów)

Pro SWT:

  • bardziej natywny system operacyjny
  • szybciej
nanda
źródło
10
Myślę, że „szybszy” punkt jest wysoce kontrowersyjny.
Russ Hayward,
SWT jest niewygodny w użyciu, musiałem przetestować GUI z każdą wersją systemu Windows, niektóre błędy można było odtworzyć tylko pod Windows Vista. Niektóre metody są po prostu niezaimplementowane lub wywołują AWT pod maską, co oznacza, że ​​nie można używać kompaktowego JRE bez AWT i Swinga bez ryzyka zerwania SWT. Zacząłem używać SWT w 2009 roku i moim skromnym zdaniem nie jest szybszy. Radzę dostarczyć starannie zaprojektowany benchmark.
gouessej
4

Jedna rzecz do rozważenia: czytniki ekranu

Z pewnych powodów niektóre komponenty Swing nie działają dobrze podczas korzystania z czytnika ekranu (i Java AccessBridge dla Windows). Wiedz, że różne czytniki ekranu powodują różne zachowania. Z mojego doświadczenia wynika, że ​​SWT-Tree działa o wiele lepiej niż Swing-Tree w połączeniu z czytnikiem ekranu. W ten sposób nasza aplikacja wykorzystywała zarówno komponenty SWT, jak i Swing.

W celu dystrybucji i ładowania odpowiedniej biblioteki SWT, ten link może okazać się przydatny: http://www.chrisnewland.com/select-correct-swt-jar-for-your-os-and-jvm-at-runtime-191

incomudro
źródło
3

SWT powstał jako odpowiedź na powolność Swinga na przełomie XIX i XX wieku. Teraz, gdy różnice w wydajności stają się pomijalne, myślę, że Swing jest lepszą opcją dla standardowych aplikacji. SWT / Eclipse ma ładną strukturę, która pomaga w wielu kodach kotłów.

Oliver Watkins
źródło