Jaka jest różnica między Swing a AWT?


Odpowiedzi:


235

AWT to interfejs Java do natywnego kodu GUI systemu obecnego w systemie operacyjnym. Nie będzie działać tak samo na każdym systemie, chociaż próbuje.

Swing to mniej lub bardziej czysty interfejs GUI. Korzysta z AWT, aby utworzyć okno systemu operacyjnego, a następnie maluje obrazy przycisków, etykiet, tekstu, pól wyboru itp. W tym oknie i reaguje na wszystkie kliknięcia myszą, wpisy kluczy itp., Sam decydując, co zrobić zamiast pozwolić systemowi operacyjnemu sobie z tym poradzić. W ten sposób Swing jest w 100% przenośny i taki sam na różnych platformach (chociaż jest łatwy do skinowania i ma „wygląd i wtyczkę”, dzięki czemu może wyglądać mniej więcej tak, jak wyglądałyby natywne okna i widżety).

Są to bardzo różne podejścia do zestawów narzędzi GUI i mają wiele konsekwencji. Pełna odpowiedź na Twoje pytanie będzie próbowała odkryć wszystkie te pytania. :) Oto kilka:

AWT jest interfejsem wieloplatformowym, więc nawet jeśli używa swojej podstawowej wersji systemu operacyjnego lub natywnego zestawu narzędzi GUI, nie zapewnia dostępu do wszystkiego, co mogą zrobić te zestawy narzędzi. Zaawansowane lub nowsze widżety AWT, które mogą istnieć na jednej platformie, mogą nie być obsługiwane na innej. Funkcje widżetów, które nie są takie same na każdej platformie, mogą nie być obsługiwane lub, co gorsza, mogą działać inaczej na każdej platformie. Ludzie wkładali wiele wysiłku, aby aplikacje AWT działały konsekwentnie na różnych platformach - na przykład mogą próbować wywoływać kod natywny z języka Java.

Ponieważ AWT używa natywnych widżetów GUI, Twój system operacyjny wie o nich i obsługuje umieszczanie ich przed sobą itp., Podczas gdy widżety Swing są pozbawionymi znaczenia pikselami w oknie z punktu widzenia twojego systemu operacyjnego. Sam Swing obsługuje układ i układanie widżetów. Mieszanie AWT i Swing jest wysoce nieobsługiwane i może prowadzić do absurdalnych rezultatów, takich jak natywne przyciski, które zasłaniają wszystko inne w oknie dialogowym, w którym się znajdują, ponieważ wszystko inne zostało utworzone za pomocą Swing.

Ponieważ Swing próbuje robić wszystko, co możliwe w Javie, z wyjątkiem bardzo surowych procedur graficznych udostępnianych przez rodzime okno GUI, poniosło to znaczną obniżkę wydajności w porównaniu z AWT. To spowodowało, że Swing niestety powoli zaczął łapać. Jednak w ciągu ostatnich kilku lat znacznie się to zmniejszyło z powodu bardziej zoptymalizowanych maszyn JVM, szybszych maszyn i (jak sądzę) optymalizacji wewnętrznych elementów Swing. Dzisiaj aplikacja Swing może działać wystarczająco szybko, aby była sprawna lub nawet spakowana, i prawie nie do odróżnienia od aplikacji używającej natywnych widżetów. Niektórzy powiedzą, że zajęło to zbyt długo, ale większość powie, że warto.

Na koniec możesz także wypróbować SWT (zestaw narzędzi GUI używany dla Eclipse oraz alternatywa zarówno dla AWT, jak i Swing), co jest poniekąd powrotem do pomysłu AWT na dostęp do natywnych widżetów przez Javę.


Um ... po wykonaniu dość rozległej huśtawki na wielu platformach, mogę ci powiedzieć, że bardzo nie jest tak samo na różnych platformach. Podobny? Pewnie. Podobnie? Nie ma mowy.
cletus

1
Problemy wagi ciężkiej / wagi lekkiej znikną wraz z aktualizacją Java 6 12 (patrz java.dzone.com/news/a-farewell-heavyweightlightwei ).
Dan Dyer

Łał. Nie mogę uwierzyć, że mogą to naprawić, i nadal nie mogę uwierzyć, że mieszanie lekkich i ciężkich elementów byłoby kiedykolwiek pożądane. Ale to niesamowite, że mogą to naprawić.
skiphoppy

Po prostu zapomnij o obu. Spójrz na WPF. :)
Alper Ozcetin,

3
Oto oficjalny artykuł Java potwierdzający, że miksowanie zostało naprawione: oracle.com/technetwork/articles/java/…
user193130

35

Podstawową różnicą, o której już wszyscy wspominali, jest to, że jedna jest ciężka, a druga lekka . Pozwól mi wyjaśnić, w zasadzie to, co oznacza pojęcie „ciężar”, oznacza, że ​​kiedy używasz komponentów awt, natywny kod używany do uzyskania komponentu widoku jest generowany przez system operacyjny , dlatego wygląd i działanie zmienia się z systemu operacyjnego na system operacyjny. W przypadku gdy, podobnie jak w komponentach wahadłowych, JVM odpowiada za generowanie widoku komponentów. Innym stwierdzeniem, które widziałem jest to, że swing jest oparty na MVC, a awt nie.


14
faktycznie Swing stosuje podejście model-delegat, które wywodzi się z podejścia MVC, gdzie w widoku i kontrolerze są połączone dla struktury delegata
Purushottam

15

Huśtawka vs AWT . Zasadniczo AWT był pierwszy i jest zestawem ciężkich elementów interfejsu użytkownika (co oznacza, że ​​są one opakowaniami dla obiektów systemu operacyjnego), podczas gdy Swing jest zbudowany na AWT z bogatszym zestawem lekkich komponentów.

Wszelkie poważne prace nad interfejsem Java są wykonywane w Swing, a nie AWT, który był używany głównie w apletach.


1
czy są jakieś przypadki, w których awt jest bardziej użyteczny / zaleca się użycie niż swing?
Samiksha

1
Kiedyś było to istotne ... 10 lat temu.
Bart

@Pacerier mówił o AWT, a nie o SWT

11

O ile AWT może być bardziej przydatne niż Swing -

  • możesz celować w starszą JVM lub platformę, która nie obsługuje Swing. Kiedyś budowało się aplety - naprawdę chciało się trafić w najniższy wspólny mianownik, aby ludzie nie musieli instalować nowszej wtyczki Java. Nie jestem pewien, jaka jest obecnie najczęściej instalowana wersja wtyczki Java - dziś może być inaczej.
  • niektórzy wolą natywny wygląd AWT niż skórki platformy Swinga „nie do końca”. (Są lepsze natywne wyglądające skórki innych firm niż implementacje Swing BTW) Wiele osób woli używać FileDialog AWT niż FileChooser Swinga, ponieważ daje okno dialogowe pliku platformy, do którego przywykła większość ludzi, zamiast „dziwnego” niestandardowego Swinga.

2
Ale w ostatnim przypadku możemy również utworzyć FileChooser, który wygląda jak okno dialogowe pliku systemu Windows (ale bez autouzupełniania) stackoverflow.com/q/17630055/2534090
JavaTechnical

9

Różnice między AWT i Swing wynikają z kilku konsekwencji.

AWT to cienka warstwa kodu na systemie operacyjnym, podczas gdy Swing jest znacznie większy. Swing ma również znacznie bogatszą funkcjonalność. Korzystając z AWT, musisz sam wdrożyć wiele rzeczy, podczas gdy Swing ma je wbudowane. W przypadku pracy wymagającej dużego GUI, AWT jest bardzo prymitywna w porównaniu do Swinga. Ponieważ Swing sam implementuje funkcjonalność GUI zamiast polegać na systemie operacyjnym hosta, może zaoferować bogatsze środowisko na wszystkich platformach, na których działa Java. AWT jest bardziej ograniczony w dostarczaniu tej samej funkcjonalności na wszystkich platformach, ponieważ nie wszystkie platformy implementują takie same kontrolki w ten sam sposób.

Komponenty Swing są nazywane „lekkimi”, ponieważ nie wymagają natywnego obiektu systemu operacyjnego do wdrożenia ich funkcji. JDialogi JFramesą ciężkie, ponieważ mają rówieśników. Tak jak komponenty JButton, JTextAreaitp, są lekkie, ponieważ nie mają sobie równych OS.

Element równorzędny to widget dostarczany przez system operacyjny, taki jak obiekt przycisku lub obiekt pola wejściowego.


7

Huśtawka:

  1. Huśtawka jest częścią klas java Foundation.
  2. Komponenty Swing są niezależne od platformy.
  3. Komponenty huśtawki są lekkimi komponentami, ponieważ huśtawka znajduje się na górze szyby.

AWT:

  1. AWT nazywa się narzędziem abstrakcyjnego okna.
  2. Komponenty AWT są zależne od platformy.
  3. Komponenty AWT są komponentami ciężkimi.

5
  • komponent swing zapewnia bardzo elastyczny interfejs użytkownika, ponieważ jest zgodny z kontrolerem widoku modelu (mvc)
  • awt nie jest oparty na mvc.
  • huśtawka działa szybciej.
  • awt nie działa szybciej.
  • elementy huśtawki są lekkie.
  • komponenty awt są ciężkie.
  • huśtawka zajmuje mniej miejsca w pamięci.
  • awt zajmuje więcej miejsca w pamięci.
  • Element swing jest niezależny od platformy.
  • awt zależy od platformy.
  • swing wymaga pakietu javax.swing.
  • awt wymaga pakietu javax.awt.

10
Nie sądzę, żeby swing działał szybciej niż AWT, ponieważ AWT używa natywnego kodu (kodu GUI), który był już w systemie operacyjnym, ale swing buduje każdy komponent od zera. AWT może być szybszy. Czy możesz mi powiedzieć, jaki jest twój punkt widzenia, mówiąc, że swing działa szybciej ? Dzięki.
JavaTechnical

3

AWT 1. AWT zajmuje więcej miejsca w pamięci 2. AWT zależy od platformy 3. AWT wymaga pakietu javax.awt

huśtawki 1. Huśtawka zajmuje mniej miejsca w pamięci 2. Komponent Swing jest niezależny od platformy 3. Swing wymaga pakietu javax.swing


1
Czy możesz mi powiedzieć, w jaki sposób AWT zajmuje więcej miejsca w pamięci? Ponieważ używa kodu natywnego?
JavaTechnical

awt wymaga java.awt. *
abhisekp
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.