Quelle est la différence entre Swing et AWT?

Réponses:

235

AWT est une interface Java vers le code GUI du système natif présent dans votre système d'exploitation. Il ne fonctionnera pas de la même manière sur tous les systèmes, bien qu'il essaie.

Swing est une interface graphique Java plus ou moins pure. Il utilise AWT pour créer une fenêtre de système d'exploitation, puis peint des images de boutons, d'étiquettes, de texte, de cases à cocher, etc. dans cette fenêtre et répond à tous vos clics de souris, entrées de clés, etc., décidant par lui-même quoi faire au lieu de laisser le système d'exploitation le gérer. Ainsi, Swing est 100% portable et est le même sur toutes les plates-formes (bien qu'il soit skinnable et ait un "aspect enfichable" qui peut le faire ressembler plus ou moins à l'apparence des fenêtres et widgets natifs).

Ce sont des approches très différentes des boîtes à outils GUI et ont beaucoup de conséquences. Une réponse complète à votre question tenterait d'explorer tous ces éléments. :) En voici deux:

AWT est une interface multiplateforme, donc même s'il utilise le système d'exploitation sous-jacent ou la boîte à outils GUI native pour ses fonctionnalités, il ne donne pas accès à tout ce que ces boîtes à outils peuvent faire. Les widgets AWT avancés ou plus récents qui pourraient exister sur une plate-forme peuvent ne pas être pris en charge sur une autre. Les fonctionnalités des widgets qui ne sont pas les mêmes sur toutes les plates-formes peuvent ne pas être prises en charge, ou pire, elles peuvent fonctionner différemment sur chaque plate-forme. Les gens investissaient beaucoup d'efforts pour que leurs applications AWT fonctionnent de manière cohérente sur toutes les plates-formes - par exemple, ils peuvent essayer de passer des appels en code natif à partir de Java.

Comme AWT utilise des widgets GUI natifs, votre système d'exploitation les connaît et gère de les placer les uns devant les autres, etc., tandis que les widgets Swing sont des pixels sans signification dans une fenêtre du point de vue de votre système d'exploitation. Swing gère la disposition et l'empilement de vos widgets. Mélanger AWT et Swing n'est pas pris en charge et peut conduire à des résultats ridicules, tels que des boutons natifs qui masquent tout le reste de la boîte de dialogue dans laquelle ils résident car tout le reste a été créé avec Swing.

Parce que Swing essaie de faire tout ce qui est possible en Java autre que les routines graphiques très brutes fournies par une fenêtre GUI native, cela entraînait une pénalité de performances par rapport à AWT. Cela a rendu Swing malheureusement lent à comprendre. Cependant, cela a considérablement diminué au cours des dernières années en raison de machines JVM plus optimisées, de machines plus rapides et (je présume) de l'optimisation des internes Swing. Aujourd'hui, une application Swing peut s'exécuter assez rapidement pour être réparable, voire zippée, et presque impossible à distinguer d'une application utilisant des widgets natifs. Certains diront qu'il a fallu beaucoup trop de temps pour en arriver là, mais la plupart diront que cela en vaut la peine.

Enfin, vous voudrez peut-être également consulter SWT (la boîte à outils GUI utilisée pour Eclipse, et une alternative à la fois à AWT et Swing), ce qui est en quelque sorte un retour à l'idée AWT d'accéder aux widgets natifs via Java.

skiphoppy
la source
Euh ... après avoir effectué un Swing assez étendu sur plusieurs plates-formes, je peux vous dire que ce n'est pas la même chose entre les plates-formes. Similaire? Sûr. Même? En aucune façon.
cletus le
1
Les problèmes de poids lourd / poids léger disparaîtront avec la mise à jour 12 de Java 6 (voir java.dzone.com/news/a-farewell-heavyweightlightwewe ).
Dan Dyer
Sensationnel. Je ne peux pas croire qu'ils puissent le réparer, et je ne peux toujours pas croire que mélanger des composants légers et lourds serait jamais souhaitable. Mais c'est incroyable qu'ils puissent y remédier.
skiphoppy
Oubliez les deux. Jetez un œil à WPF. :)
Alper Ozcetin
3
Voici un article officiel de Java confirmant que le mixage est corrigé: oracle.com/technetwork/articles/java/…
user193130
35

La différence de base ce que tout le monde a déjà mentionné est que l'un est lourd et l'autre léger . Permettez-moi d'expliquer que le terme poids lourd signifie que lorsque vous utilisez les composants awt, le code natif utilisé pour obtenir le composant de vue est généré par le système d'exploitation , c'est pourquoi l'apparence change d'OS en OS. Alors que dans les composants swing, il est de la responsabilité de la JVM de générer la vue des composants. Une autre déclaration que j'ai vue est que le swing est basé sur MVC et awt ne l'est pas.

Accès refusé
la source
14
en fait, Swing utilise une approche Model-Delegate, qui est dérivée de l'approche MVC, où dans la vue et le contrôleur sont combinés pour une structure de délégué
Purushottam
15

Swing vs AWT . Fondamentalement, AWT est arrivé en premier et est un ensemble de composants d'interface utilisateur lourds (ce qui signifie qu'ils sont des wrappers pour les objets du système d'exploitation) tandis que Swing s'est construit au-dessus d'AWT avec un ensemble plus riche de composants légers.

Tout travail sérieux de l'interface utilisateur Java est effectué dans Swing not AWT, qui était principalement utilisé pour les applets.

cletus
la source
1
y a-t-il des cas où awt est plus utile / conseillé d'utiliser que swing?
Samiksha
1
C'était pertinent ... il y a 10 ans.
Bart le
@Pacerier dont il parlait AWT, pas SWT
11

Dans la mesure où AWT peut être plus utile que Swing -

  • vous ciblez peut-être une JVM ou une plateforme plus ancienne qui ne prend pas en charge Swing. Cela entrait vraiment en jeu si vous construisiez des applets - vous vouliez cibler le plus petit dénominateur commun pour que les gens n'aient pas à installer un plugin Java plus récent. Je ne sais pas quelle est la version actuelle du plugin Java la plus installée - cela peut être différent aujourd'hui.
  • certaines personnes préfèrent l'aspect natif d'AWT aux skins de plate-forme `` pas tout à fait là '' de Swing. (Il y a de meilleurs skins d'apparence native que les implémentations de Swing BTW) Beaucoup de gens préféraient utiliser FileDialog d'AWT plutôt que FileChooser de Swing car cela donnait la boîte de dialogue de fichier de plate-forme à laquelle la plupart des gens étaient habitués plutôt que le Swing personnalisé `` bizarre ''.
Nate
la source
2
Mais pour le dernier, nous pouvons également créer un FileChooser qui ressemble à peu près à une boîte de dialogue de fichier Windows (mais sans saisie semi-automatique) stackoverflow.com/q/17630055/2534090
JavaTechnical
9

Plusieurs conséquences résultent de cette différence entre AWT et Swing.

AWT est une fine couche de code au-dessus du système d'exploitation, tandis que Swing est beaucoup plus grande. Swing a également des fonctionnalités beaucoup plus riches. En utilisant AWT, vous devez implémenter beaucoup de choses vous-même, tandis que Swing les a intégrées. Pour un travail intensif en GUI, AWT se sent très primitif avec lequel travailler par rapport à Swing. Étant donné que Swing implémente lui-même la fonctionnalité de l'interface graphique plutôt que de s'appuyer sur le système d'exploitation hôte, il peut offrir un environnement plus riche sur toutes les plates-formes sur lesquelles Java s'exécute. AWT est plus limité dans la fourniture des mêmes fonctionnalités sur toutes les plates-formes car toutes les plates-formes n'implémentent pas les mêmes contrôles de la même manière.

Les composants Swing sont appelés "légers" car ils ne nécessitent pas d'objet OS natif pour implémenter leurs fonctionnalités. JDialoget JFramesont lourds, car ils ont un pair. Ainsi , des composants comme JButton, JTextArea, etc., sont légers parce qu'ils ne disposent pas d' un système d'exploitation par les pairs.

Un pair est un widget fourni par le système d'exploitation, tel qu'un objet bouton ou un objet champ de saisie.

Surendra Bharadwaj
la source
7

Balançoire:

  1. Swing fait partie des classes de base Java.
  2. Les composants Swing sont indépendants de la plate-forme.
  3. Les composants de balançoire sont des composants légers, car la balançoire se trouve sur le dessus de l'AWT.

AWT:

  1. AWT est appelé l'outil de fenêtre abstraite.
  2. Les composants AWT dépendent de la plate-forme.
  3. Les composants AWT sont des composants lourds.
deepika
la source
5
  • le composant swing fournit une interface utilisateur beaucoup plus flexible car il suit le contrôleur de vue du modèle (mvc).
  • awt n'est pas basé sur mvc.
  • le swing fonctionne plus rapidement.
  • awt ne fonctionne pas plus rapidement.
  • les composants de balançoire sont légers.
  • les composants awt sont lourds.
  • swing occupe moins d'espace mémoire.
  • awt occupe plus d'espace mémoire.
  • le composant swing est indépendant de la plateforme.
  • awt dépend de la plateforme.
  • swing nécessite le package javax.swing.
  • awt nécessite le package javax.awt.
arsh
la source
10
Je ne pense pas que swing fonctionne plus rapidement que AWT car AWT utilise du code natif (le code gui) qui était déjà là dans le système d'exploitation, mais swing construit chaque composant à partir de zéro. Ainsi, AWT pourrait être plus rapide. Pourriez-vous me dire quel est votre point de vue en disant que le swing fonctionne plus vite ? Merci.
JavaTechnical
3

AWT 1. AWT occupe plus d'espace mémoire 2. AWT dépend de la plateforme 3. AWT nécessite le package javax.awt

balançoires 1. Swing occupe moins d'espace mémoire 2. Le composant Swing est indépendant de la plateforme 3. Swing nécessite le package javax.swing

B.DastagiriReddy
la source
1
Pourriez-vous me dire comment AWT occupe plus d'espace mémoire? Parce qu'il utilise du code natif?
JavaTechnical
awt nécessite java.awt. *
abhisekp