Qual è la differenza tra Swing e AWT?


Risposte:


235

AWT è un'interfaccia Java per il codice GUI del sistema nativo presente nel tuo sistema operativo. Non funzionerà allo stesso modo su tutti i sistemi, anche se ci prova.

Swing è una GUI Java più o meno pura. Utilizza AWT per creare una finestra del sistema operativo e quindi dipinge immagini di pulsanti, etichette, testo, caselle di controllo, ecc. In quella finestra e risponde a tutti i clic del mouse, le voci dei tasti, ecc., Decidendo autonomamente cosa fare invece di lasciarlo gestire dal sistema operativo. Quindi Swing è portatile al 100% ed è lo stesso su tutte le piattaforme (anche se è personalizzabile e ha un "aspetto collegabile" che può renderlo più o meno simile a come apparirebbero le finestre e i widget nativi).

Questi sono approcci molto diversi ai toolkit GUI e hanno molte conseguenze. Una risposta completa alla tua domanda proverebbe a esplorare tutte quelle. :) Eccone un paio:

AWT è un'interfaccia multipiattaforma, quindi anche se utilizza il sistema operativo sottostante o il toolkit GUI nativo per le sue funzionalità, non fornisce l'accesso a tutto ciò che tali toolkit possono fare. I widget AWT avanzati o più recenti che potrebbero esistere su una piattaforma potrebbero non essere supportati su un'altra. Le funzionalità dei widget che non sono le stesse su ogni piattaforma potrebbero non essere supportate o, peggio ancora, potrebbero funzionare in modo diverso su ciascuna piattaforma. Le persone erano solite investire molto sforzo per far funzionare le loro applicazioni AWT in modo coerente su piattaforme diverse, ad esempio, potrebbero provare a effettuare chiamate in codice nativo da Java.

Poiché AWT utilizza widget GUI nativi, il tuo sistema operativo li conosce e gestisce mettendoli uno di fronte all'altro, ecc., Mentre i widget Swing sono pixel senza significato all'interno di una finestra dal punto di vista del tuo sistema operativo. Swing stesso gestisce il layout e l'impilamento dei widget. Il mix di AWT e Swing non è supportato e può portare a risultati ridicoli, come pulsanti nativi che oscurano tutto il resto nella finestra di dialogo in cui risiedono perché tutto il resto è stato creato con Swing.

Poiché Swing tenta di fare tutto il possibile in Java oltre alle routine grafiche molto grezze fornite da una finestra della GUI nativa, ha comportato una penalizzazione delle prestazioni rispetto ad AWT. Questo ha reso Swing sfortunatamente lento ad afferrare. Tuttavia, questo si è ridotto drasticamente negli ultimi anni a causa di JVM più ottimizzate, macchine più veloci e (presumo) ottimizzazione degli interni Swing. Oggi un'applicazione Swing può essere eseguita abbastanza velocemente da essere utile o anche zippy e quasi indistinguibile da un'applicazione utilizzando widget nativi. Alcuni diranno che ci è voluto troppo tempo per arrivare a questo punto, ma molti diranno che ne vale la pena.

Infine, potresti anche voler dare un'occhiata a SWT (il toolkit della GUI usato per Eclipse e un'alternativa sia ad AWT che a Swing), che è in qualche modo un ritorno all'idea di AWT di accedere ai widget nativi tramite Java.


Uhm ... dopo aver fatto alcune oscillazioni piuttosto estese su più piattaforme, posso dirti che non è più lo stesso su tutte le piattaforme. Simile? Sicuro. Stesso? Non c'è modo.
cletus,

1
I problemi dei pesi massimi / leightweight scompariranno con Java 6 aggiornamento 12 (consultare java.dzone.com/news/a-farewell-heavyweightlightwei ).
Dan Dyer,

Wow. Non riesco a credere che possano risolverlo, e non riesco ancora a credere che mescolare componenti leggeri e pesanti sarebbe mai desiderabile. Ma è incredibile che possano risolverlo.
skiphoppy,

Dimentica entrambi. Dai un'occhiata a WPF. :)
Alper Ozcetin,

3
Ecco un articolo Java ufficiale che conferma che il missaggio è stato risolto: oracle.com/technetwork/articles/java/…
user193130

35

La differenza di base che già tutti hanno menzionato è che uno è pesante e l'altro è leggero . Permettetemi di spiegare, in sostanza il significato del termine heavyweight è che quando si utilizzano i componenti awt il codice nativo utilizzato per ottenere il componente di visualizzazione viene generato dal sistema operativo , ecco perché l'aspetto cambia da sistema operativo a sistema operativo. Laddove, come nei componenti swing, è responsabilità di JVM generare la vista per i componenti. Un'altra affermazione che ho visto è che swing è basato su MVC e non lo è.


14
in realtà Swing utilizza un approccio Model-Delegate, che deriva dall'approccio MVC, in cui View e Controller sono combinati per una struttura Delegate
Purushottam,

15

Swing vs AWT . Fondamentalmente AWT è arrivato per primo ed è un insieme di componenti UI pesanti (nel senso che sono involucri per gli oggetti del sistema operativo) mentre Swing è costruito sopra AWT con un set più ricco di componenti leggeri.

Qualsiasi lavoro serio sull'interfaccia utente Java viene eseguito in Swing non AWT, utilizzato principalmente per le applet.


1
ci sono casi in cui è più utile / consigliato usare wt quindi swing?
Samiksha,

1
Un tempo era rilevante ... 10 anni fa.
Bart

@Pacerier stava parlando di AWT, non di SWT

11

Fino a quando AWT può essere più utile di Swing -

  • potresti scegliere come target una JVM o una piattaforma precedente che non supporta Swing. Questo era davvero utile se stavi costruendo applet: volevi scegliere il minimo comune denominatore in modo che le persone non dovessero installare un nuovo plug-in Java. Non sono sicuro di quale sia la versione attualmente più installata del plug-in Java, oggi potrebbe essere diversa.
  • alcune persone preferiscono l'aspetto nativo di AWT rispetto alle skin della piattaforma "non del tutto lì" di Swing. (Ci sono skin dall'aspetto nativo di terze parti migliori rispetto alle implementazioni di Swing BTW) Molte persone preferivano usare FileDialog di AWT su FileChooser di Swing perché forniva la finestra di dialogo dei file della piattaforma a cui la maggior parte delle persone era abituata piuttosto che quella "strana" personalizzata di Swing.

2
Ma per l'ultimo, possiamo anche creare un FileChooser che praticamente appare come finestra file di Windows (ma senza completamento automatico) stackoverflow.com/q/17630055/2534090
JavaTechnical

9

Diverse conseguenze derivano da questa differenza tra AWT e Swing.

AWT è un sottile strato di codice nella parte superiore del sistema operativo, mentre Swing è molto più grande. Swing ha anche funzionalità molto più ricche. Utilizzando AWT, devi implementare molte cose tu stesso, mentre Swing le ha integrate. Per il lavoro ad alta intensità di GUI, AWT si sente molto primitivo con cui lavorare rispetto a Swing. Poiché Swing implementa la funzionalità GUI stessa anziché fare affidamento sul sistema operativo host, può offrire un ambiente più ricco su tutte le piattaforme su cui è in esecuzione Java. AWT è più limitato nel fornire la stessa funzionalità su tutte le piattaforme perché non tutte le piattaforme implementano gli stessi controlli allo stesso modo.

I componenti Swing sono chiamati "leggeri" perché non richiedono un oggetto SO nativo per implementare la loro funzionalità. JDialoge JFramesono dei pesi massimi, perché hanno un pari. Quindi componenti come JButton, JTextAreaecc. Sono leggeri perché non hanno un peer del sistema operativo.

Un peer è un widget fornito dal sistema operativo, come un oggetto pulsante o un oggetto campo di immissione.


7

Swing:

  1. Swing fa parte delle classi di fondazione Java.
  2. I componenti Swing sono indipendenti dalla piattaforma.
  3. I componenti dell'oscillazione sono componenti leggeri perché l'oscillazione si trova sulla cima di awt.

AWT:

  1. AWT è chiamato lo strumento finestra astratta.
  2. I componenti AWT dipendono dalla piattaforma.
  3. I componenti AWT sono componenti pesanti.

5
  • Il componente swing offre un'interfaccia utente molto flessibile perché segue il controller di visualizzazione dei modelli (mvc).
  • awt non è basato su mvc.
  • l'altalena funziona più velocemente.
  • awt non funziona più velocemente.
  • i componenti dell'oscillazione sono leggeri.
  • i componenti sono pesanti.
  • swing occupa meno spazio di memoria.
  • awt occupa più spazio di memoria.
  • il componente swing è indipendente dalla piattaforma.
  • awt dipende dalla piattaforma.
  • swing richiede il pacchetto javax.swing.
  • richiede il pacchetto javax.awt.

10
Non penso che swing funzioni più velocemente di AWT perché AWT utilizza il codice nativo (il codice gui) che era già presente nel sistema operativo, ma swing crea ogni componente da zero. Quindi AWT potrebbe essere più veloce. Potresti dirmi qual è il tuo punto di vista nel dire che lo swing funziona più velocemente ? Grazie.
JavaTechnical

3

AWT 1. AWT occupa più spazio di memoria 2. AWT dipende dalla piattaforma 3. AWT richiede il pacchetto javax.awt

altalene 1. Swing occupa meno spazio di memoria 2. Il componente Swing è indipendente dalla piattaforma 3. Swing richiede il pacchetto javax.swing


1
Potresti dirmi in che modo AWT occupa più spazio di memoria? Perché usa il codice nativo?
JavaTechnical

awt richiede java.awt. *
abhisekp,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.