¿Cuál es la diferencia entre Swing y AWT?

Respuestas:

235

AWT es una interfaz Java para el código GUI del sistema nativo presente en su sistema operativo. No funcionará igual en todos los sistemas, aunque lo intente.

Swing es una GUI de Java más o menos pura. Utiliza AWT para crear una ventana del sistema operativo y luego pinta imágenes de botones, etiquetas, texto, casillas de verificación, etc., en esa ventana y responde a todos sus clics del mouse, entradas de teclas, etc., decidiendo por sí mismo qué hacer en lugar de dejar que el sistema operativo lo maneje. Por lo tanto, Swing es 100% portátil y es el mismo en todas las plataformas (aunque es personalizable y tiene un "aspecto y estilo conectables" que puede hacer que se vea más o menos como se verían las ventanas y widgets nativos).

Estos son enfoques muy diferentes a los kits de herramientas de la GUI y tienen muchas consecuencias. Una respuesta completa a su pregunta trataría de explorarlos todos. :) Aquí hay una pareja:

AWT es una interfaz multiplataforma, por lo que, aunque utiliza el sistema operativo subyacente o el kit de herramientas GUI nativo para su funcionalidad, no proporciona acceso a todo lo que esos kits de herramientas pueden hacer. Los widgets AWT avanzados o más nuevos que pueden existir en una plataforma pueden no ser compatibles con otra. Es posible que no se admitan las características de los widgets que no son las mismas en todas las plataformas, o peor aún, podrían funcionar de manera diferente en cada plataforma. La gente solía invertir mucho esfuerzo para que sus aplicaciones AWT funcionen de manera consistente en todas las plataformas; por ejemplo, pueden intentar hacer llamadas a código nativo desde Java.

Debido a que AWT usa widgets de GUI nativos, su sistema operativo los conoce y maneja poniéndolos uno frente al otro, etc., mientras que los widgets Swing son píxeles sin sentido dentro de una ventana desde el punto de vista de su sistema operativo. Swing maneja el diseño y el apilamiento de tus widgets. La combinación de AWT y Swing es altamente incompatible y puede conducir a resultados ridículos, como botones nativos que ocultan todo lo demás en el cuadro de diálogo en el que residen porque todo lo demás se creó con Swing.

Debido a que Swing intenta hacer todo lo posible en Java, aparte de las rutinas gráficas muy crudas proporcionadas por una ventana GUI nativa, solía incurrir en una penalización de rendimiento en comparación con AWT. Desafortunadamente, esto hizo que Swing tardara en ponerse al día. Sin embargo, esto se ha reducido drásticamente en los últimos años debido a JVM más optimizadas, máquinas más rápidas y (supongo) la optimización de las partes internas de Swing. Hoy en día, una aplicación Swing puede ejecutarse lo suficientemente rápido como para ser útil o incluso rápida, y casi indistinguible de una aplicación que utiliza widgets nativos. Algunos dirán que tomó demasiado tiempo llegar a este punto, pero la mayoría dirá que vale la pena.

Finalmente, es posible que también desee consultar SWT (el kit de herramientas GUI utilizado para Eclipse, y una alternativa tanto a AWT como a Swing), que es un retorno a la idea de AWT de acceder a Widgets nativos a través de Java.

skiphoppy
fuente
Um ... habiendo hecho un Swing bastante extenso en múltiples plataformas, puedo decirte que no es lo mismo en todas las plataformas. ¿Similar? Por supuesto. ¿Mismo? De ninguna manera.
cletus
1
Los problemas de peso pesado / peso ligero desaparecerán con la actualización 12 de Java 6 (consulte java.dzone.com/news/a-farewell-heavyweightlightwei ).
Dan Dyer el
Guau. No puedo creer que puedan arreglarlo, y todavía no puedo creer que sea deseable mezclar componentes ligeros y pesados. Pero es increíble que puedan arreglarlo.
skiphoppy 03 de
Solo olvídate de ambos. Echa un vistazo a WPF. :)
Alper Ozcetin
3
Aquí hay un artículo oficial de Java que confirma que la mezcla está arreglada: oracle.com/technetwork/articles/java/…
user193130
35

La diferencia básica que ya todos mencionaron es que uno es pesado y el otro es ligero . Permítanme explicar, básicamente, lo que significa el término peso pesado es que cuando usa los componentes awt, el sistema operativo genera el código nativo utilizado para obtener el componente de vista , por eso la apariencia cambia de un sistema operativo a otro. Donde, como en los componentes de swing, es responsabilidad de JVM generar la vista de los componentes. Otra afirmación que vi es que el swing está basado en MVC y awt no.

Acceso denegado
fuente
14
en realidad Swing utiliza un enfoque de Modelo-Delegado, que se deriva del enfoque MVC, donde en la Vista y el Controlador se combinan para una estructura de Delegado
Purushottam
15

Swing vs AWT . Básicamente, AWT fue lo primero y es un conjunto de componentes de interfaz de usuario pesados ​​(lo que significa que son envoltorios para los objetos del sistema operativo), mientras que Swing se construyó sobre AWT con un conjunto más rico de componentes livianos.

Cualquier trabajo serio de UI de Java se realiza en Swing, no en AWT, que se usó principalmente para applets.

cletus
fuente
1
¿Hay algún caso en el que awt sea más útil / aconsejable usar que hacer swing?
Samiksha
1
Solía ​​ser relevante ... hace 10 años.
Bart
@Pacerier estaba hablando de AWT, no de SWT
11

En cuanto a cuándo AWT puede ser más útil que Swing:

  • puede estar apuntando a una JVM o plataforma anterior que no sea compatible con Swing. Esto solía entrar en juego si estabas construyendo Applets: querías apuntar al mínimo común denominador para que las personas no tuvieran que instalar un complemento Java más nuevo. No estoy seguro de cuál es la versión actual más instalada del complemento de Java; esto puede ser diferente hoy.
  • Algunas personas prefieren la apariencia nativa de AWT sobre las máscaras de plataforma 'no del todo' de Swing. (Hay mejores aspectos de apariencia nativa de terceros que las implementaciones de Swing, por cierto) Mucha gente prefirió usar FileDialog de AWT sobre FileChooser de Swing porque daba el diálogo de archivo de plataforma al que la mayoría de la gente estaba acostumbrada en lugar del Swing personalizado `` extraño ''.
Nate
fuente
2
Pero para el último, también podemos crear un FileChooser que se parece al diálogo de archivos de Windows (pero sin autocompletar) stackoverflow.com/q/17630055/2534090
JavaTechnical
9

Varias consecuencias resultan de esta diferencia entre AWT y Swing.

AWT es una capa delgada de código en la parte superior del sistema operativo, mientras que Swing es mucho más grande. Swing también tiene una funcionalidad mucho más rica. Con AWT, debe implementar muchas cosas usted mismo, mientras que Swing las tiene incorporadas. Para un trabajo intensivo en GUI, AWT se siente muy primitivo para trabajar en comparación con Swing. Debido a que Swing implementa la funcionalidad GUI en sí misma en lugar de depender del sistema operativo host, puede ofrecer un entorno más rico en todas las plataformas en las que se ejecuta Java. AWT es más limitado en el suministro de la misma funcionalidad en todas las plataformas porque no todas las plataformas implementan los mismos controles de la misma manera.

Los componentes Swing se denominan "ligeros" porque no requieren un objeto de sistema operativo nativo para implementar su funcionalidad. JDialogy JFrameson de peso pesado, porque tienen un compañero. Por lo tanto, los componentes como JButton, JTextAreaetc., son livianos porque no tienen un sistema operativo similar.

Un par es un widget proporcionado por el sistema operativo, como un objeto de botón o un objeto de campo de entrada.

Surendra Bharadwaj
fuente
7

Columpio:

  1. Swing es parte de las clases básicas de Java.
  2. Los componentes de oscilación son independientes de la plataforma.
  3. Los componentes del columpio son componentes livianos porque el columpio se encuentra en la parte superior de awt.

AWT:

  1. AWT se llama la herramienta de ventana abstracta.
  2. Los componentes de AWT dependen de la plataforma.
  3. Los componentes AWT son componentes pesados.
deepika
fuente
5
  • El componente swing proporciona una interfaz de usuario mucho más flexible porque sigue el controlador de vista de modelo (mvc).
  • awt no está basado en mvc.
  • El swing funciona más rápido.
  • awt no funciona más rápido
  • Los componentes del columpio son ligeros.
  • Los componentes awt son pesados.
  • El swing ocupa menos espacio de memoria.
  • awt ocupa más espacio en la memoria.
  • El componente oscilante es independiente de la plataforma.
  • awt depende de la plataforma.
  • swing requiere el paquete javax.swing.
  • awt requiere el paquete javax.awt.
arsh
fuente
10
No creo que swing funcione más rápido que AWT porque AWT usa código nativo (el código gui) que ya estaba allí en el sistema operativo, pero swing construye todos los componentes desde cero. Entonces AWT podría ser más rápido. ¿Podría decirme cuál es su punto de vista al decir que el swing funciona más rápido ? Gracias.
JavaTechnical
3

AWT 1. AWT ocupa más espacio en la memoria 2. AWT depende de la plataforma 3. AWT requiere el paquete javax.awt

columpios 1. Swing ocupa menos espacio en la memoria 2. El componente Swing es independiente de la plataforma 3. Swing requiere el paquete javax.swing

B.DastagiriReddy
fuente
1
¿Podría decirme cómo AWT ocupa más espacio en la memoria? ¿Porque usa código nativo?
JavaTechnical
awt requiere java.awt. *
abhisekp