
Swing es un conjunto de herramientas de widgets GUI para Java . [ 1 ] Forma parte de las Java Foundation Classes (JFC) de Oracle , una API para proporcionar una interfaz gráfica de usuario (GUI) para programas Java.
Swing se desarrolló para proporcionar un conjunto de componentes de interfaz gráfica de usuario (GUI) más sofisticado que el anterior Abstract Window Toolkit (AWT) . Swing ofrece una apariencia que emula la de varias plataformas y también admite una apariencia personalizable que permite a las aplicaciones tener una apariencia independiente de la plataforma subyacente. Cuenta con componentes más potentes y flexibles que AWT. Además de componentes familiares como botones, casillas de verificación y etiquetas, Swing proporciona varios componentes avanzados como paneles con pestañas, paneles de desplazamiento, árboles, tablas y listas. [ 2 ]
A diferencia de los componentes AWT, los componentes Swing no se implementan mediante código específico de la plataforma. En cambio, están escritos completamente en Java y, por lo tanto, son independientes de la plataforma.
En diciembre de 2008, Sun Microsystems (predecesor de Oracle) lanzó el marco basado en CSS / FXML que pretendía que fuera el sucesor de Swing, llamado JavaFX . [ 3 ]
Historia
Las Internet Foundation Classes (IFC) eran una biblioteca gráfica para Java desarrollada originalmente por Netscape Communications Corporation y lanzada por primera vez el 16 de diciembre de 1996. El 2 de abril de 1997, Sun Microsystems y Netscape Communications Corporation anunciaron su intención de incorporar IFC con otras tecnologías para formar las Java Foundation Classes . [ 4 ] Posteriormente, las "Java Foundation Classes" pasaron a llamarse "Swing".
Swing introdujo un mecanismo que permitía modificar la apariencia de cada componente de una aplicación sin realizar cambios sustanciales en el código. La compatibilidad con una apariencia personalizable permite que los componentes de Swing emulen la apariencia de los componentes nativos, conservando las ventajas de la independencia de la plataforma. Originalmente distribuido como una biblioteca descargable por separado, Swing se incluyó en Java Standard Edition desde la versión 1.2. [ 5 ] Las clases y componentes de Swing se encuentran en la jerarquía javax.swingde paquetes .
El desarrollo del sucesor de Swing, JavaFX , comenzó en 2005 y se presentó oficialmente dos años después en JavaOne 2007. [ 6 ] JavaFX se liberó como código abierto en 2011 y, en 2012, pasó a formar parte de la descarga de Oracle JDK. JavaFX está reemplazando a Swing debido a varias ventajas, entre ellas ser más ligero, tener estilos CSS , controles de diseño elegantes y el uso de FXML y Scene Builder. [ 3 ] En 2018, JavaFX se integró en OpenJDK bajo el proyecto OpenJFX para acelerar su desarrollo. [ 7 ]
Los miembros del equipo del cliente Java que fue responsable de Swing incluyeron a James Gosling (arquitecto), Rick Levenson (gerente), Amy Fowler y Hans Muller (codirectores técnicos), Tom Ball, Jeff Dinkins, Georges Saab, [ 8 ] Tim Prinzing, Jonni Kanerva y Jeannette Hung y Jim Graham (gráficos 2D). [ 9 ]
Arquitectura
Swing es un marco de trabajo GUI independiente de la plataforma, basado en el modelo " modelo-vista-controlador " para Java, que sigue un modelo de programación de un solo hilo . [ 10 ] Además, este marco de trabajo proporciona una capa de abstracción entre la estructura del código y la presentación gráfica de una GUI basada en Swing.
Cimientos
Swing es independiente de la plataforma porque está escrito completamente en Java. La documentación completa de todas las clases de Swing se puede encontrar en la Guía de la API de Java para la versión 6 o en la Especificación de la API de la Plataforma Java Standard Edition 8 para la versión 8.
Extensible
Swing es una arquitectura altamente modular, que permite la "conexión" de varias implementaciones personalizadas de interfaces de marco específicas: los usuarios pueden proporcionar sus propias implementaciones personalizadas de estos componentes para anular las implementaciones predeterminadas utilizando el mecanismo de herencia de Java a través de LookAndFeel.
Swing es un framework basado en componentes , cuyos componentes derivan en última instancia de la JComponentclase. Los objetos Swing disparan eventos de forma asíncrona, tienen propiedades vinculadas y responden a un conjunto documentado de métodos específicos del componente. Los componentes Swing son componentes JavaBeans , que cumplen con la especificación JavaBeans .
Configurable
La gran dependencia de Swing de los mecanismos de tiempo de ejecución y los patrones de composición indirecta le permite responder en tiempo de ejecución a cambios fundamentales en su configuración. Por ejemplo, una aplicación basada en Swing puede actualizar su interfaz de usuario en caliente durante la ejecución. Además, los usuarios pueden proporcionar su propia implementación de apariencia, lo que permite cambios uniformes en la apariencia de las aplicaciones Swing existentes sin necesidad de modificar el código de la aplicación.
Interfaz de usuario ligera
La gran flexibilidad de Swing se refleja en su capacidad inherente para anular los controles de la interfaz gráfica de usuario (GUI) del sistema operativo anfitrión . Swing "dibuja" sus controles utilizando las API de Java 2D, en lugar de recurrir a un conjunto de herramientas de interfaz de usuario nativo. Por lo tanto, un componente Swing no tiene un componente GUI nativo correspondiente en el sistema operativo y puede renderizarse de cualquier forma posible con las interfaces gráficas subyacentes.
Sin embargo, en esencia, cada componente Swing depende de un contenedor AWTJComponent , ya que este extiende el contenedor de AWT. Esto permite que Swing se integre con el marco de gestión de la interfaz gráfica de usuario del sistema operativo anfitrión, incluyendo las asignaciones cruciales de dispositivos/pantallas e interacciones del usuario, como pulsaciones de teclas o movimientos del ratón. Swing simplemente "transpone" su propia semántica (independiente del sistema operativo) sobre los componentes subyacentes (específicos del sistema operativo). Así, por ejemplo, cada componente Swing dibuja su representación en el dispositivo gráfico en respuesta a una llamada a component.paint(), que se define en el contenedor de AWT. Pero a diferencia de los componentes AWT, que delegaban el dibujo a su widget nativo del sistema operativo, los componentes Swing son responsables de su propia representación.
Esta transposición y desacoplamiento no es meramente visual, sino que se extiende a la gestión y aplicación por parte de Swing de su propia semántica independiente del sistema operativo para los eventos que se activan dentro de sus jerarquías de contención de componentes. En términos generales, la arquitectura de Swing delega la tarea de mapear las distintas variantes de la semántica de la interfaz gráfica de usuario (GUI) del sistema operativo a un patrón simple, pero generalizado, en el contenedor AWT. Partiendo de esa plataforma generalizada, establece su propia semántica de GUI rica y compleja en forma de JComponentmodelo.
Acoplamiento flexible y MVC
La biblioteca Swing utiliza ampliamente el patrón de diseño de software modelo-vista-controlador [ 11 ] , que desacopla conceptualmente los datos que se visualizan de los controles de la interfaz de usuario a través de los cuales se visualizan. Debido a esto, la mayoría de los componentes Swing tienen modelos asociados (que se especifican en términos de interfaces Java ), y los programadores pueden usar varias implementaciones predeterminadas o proporcionar las suyas propias. El framework proporciona implementaciones predeterminadas de interfaces de modelo para todos sus componentes concretos. El uso típico del framework Swing no requiere la creación de modelos personalizados, ya que el framework proporciona un conjunto de implementaciones predeterminadas que están transparentemente, por defecto, asociadas con la clase hija correspondiente en la biblioteca Swing. En general, solo los componentes complejos, como tablas, árboles y, a veces, listas, pueden requerir implementaciones de modelos personalizadas en torno a las estructuras de datos específicas de la aplicación. Para comprender mejor el potencial que ofrece la arquitectura Swing, considérese la situación hipotética en la que los modelos personalizados para tablas y listas son envoltorios sobre servicios DAO y/o EJB .JComponent
Por lo general, los objetos del modelo de componentes Swing se encargan de proporcionar una interfaz concisa que define los eventos que se disparan y las propiedades accesibles para el modelo de datos (conceptual) que utiliza el JComponent asociado. Dado que el patrón MVC general es un patrón de relación de objetos colaborativo y poco acoplado, el modelo proporciona los medios programáticos para adjuntar oyentes de eventos al objeto del modelo de datos. Estos eventos están centrados en el modelo (por ejemplo, un evento de "fila insertada" en un modelo de tabla) y la especialización del JComponent los asigna a un evento significativo para el componente de la interfaz gráfica de usuario.
Por ejemplo, JTabletiene un modelo llamado que describe una interfaz sobre cómo una tabla accedería a los datos tabulares. Una implementación predeterminada de esto opera en una matrizTableModel bidimensional .
El componente de vista de un JComponent de Swing es el objeto que se utiliza para representar gráficamente el control conceptual de la interfaz gráfica de usuario (GUI). Una característica distintiva de Swing, como marco de trabajo para GUI, es su dependencia de controles de GUI renderizados mediante programación (en contraposición al uso de los controles de GUI nativos del sistema operativo anfitrión). Antes de Java 6 Update 10 , esta distinción generaba complicaciones al combinar controles AWT, que utilizan controles nativos, con controles Swing en una GUI (véase Combinación de componentes AWT y Swing ).
Finalmente, en cuanto a composición y gestión visual, Swing favorece los diseños relativos (que especifican las relaciones posicionales entre componentes) en contraposición a los diseños absolutos (que especifican la ubicación y el tamaño exactos de los componentes). Esta preferencia por un ordenamiento visual "fluido" se debe a sus orígenes en el entorno operativo de applets que sirvió de base para el diseño y desarrollo del kit de herramientas GUI original de Java. (Conceptualmente, esta visión de la gestión del diseño es bastante similar a la que rige la representación del contenido HTML en los navegadores y aborda las mismas preocupaciones que motivaron la anterior).
Relación con AWT

Desde las primeras versiones de Java, una parte del Abstract Window Toolkit (AWT) ha proporcionado API independientes de la plataforma para los componentes de la interfaz de usuario. En AWT, cada componente se renderiza y controla mediante un componente nativo específico del sistema de ventanas subyacente.
Por el contrario, los componentes Swing suelen describirse como ligeros porque no requieren la asignación de recursos nativos en el conjunto de herramientas de ventanas del sistema operativo. Los componentes AWT se denominan componentes pesados . [ 12 ]
Gran parte de la API de Swing es, en general, una extensión complementaria de AWT en lugar de un reemplazo directo. De hecho, cada interfaz ligera de Swing existe en última instancia dentro de un componente pesado de AWT porque todos los componentes de nivel superior en Swing ( JApplet, JDialog, JFrame, y JWindow) extienden un contenedor de nivel superior de AWT. Antes de Java 6 Update 10 , el uso de componentes ligeros y pesados dentro de la misma ventana generalmente se desaconsejaba debido a incompatibilidades de orden Z. Sin embargo, las versiones posteriores de Java han solucionado estos problemas, y ahora se pueden usar componentes de Swing y AWT en una misma interfaz gráfica de usuario sin problemas de orden Z.
La funcionalidad principal de renderizado que utiliza Swing para dibujar sus componentes ligeros la proporciona Java 2D , otra parte de JFC.
Relación con SWT
El Standard Widget Toolkit (SWT) es un conjunto de herramientas alternativo desarrollado originalmente por IBM y mantenido actualmente por la comunidad Eclipse . La implementación de SWT se asemeja más a los componentes principales de AWT. Esto ofrece ventajas como una mayor fidelidad con el conjunto de herramientas de ventanas nativo subyacente, aunque a costa de una mayor dependencia de la plataforma nativa en el modelo de programación.
Ha habido un debate y especulación significativos sobre el rendimiento de SWT frente a Swing; algunos insinuaron que la fuerte dependencia de SWT de JNI lo haría más lento cuando el componente GUI y Java necesitan comunicar datos, pero más rápido en la renderización cuando el modelo de datos se ha cargado en la GUI, pero esto no se ha confirmado en ningún sentido. [ 13 ] Un conjunto bastante exhaustivo de pruebas de rendimiento en 2005 concluyó que ni Swing ni SWT superaban claramente al otro en el caso general. [ 14 ]
Ejemplos
Hola Mundo
Esta aplicación Swing de ejemplo crea una única ventana con el mensaje "¡Hola, mundo!" en su interior:
// Hello.java (Java SE 8) import javax.swing.* ;public class Hello extends JFrame { public Hello () { super ( "Hola Mundo" ); setDefaultCloseOperation ( WindowConstants . EXIT_ON_CLOSE ); add ( new JLabel ( "Hola, mundo!" )); pack (); setVisible ( true ); }public static void main ( String [] args ) { SwingUtilities . invokeLater ( Hello :: new ); } }La primera importincluye todas las clases e interfaces públicas del javax.swingpaquete.
La Helloclase extendsla JFrameclase; la JFrameclase implementa una ventana con una barra de título y un control de cierre .
El Hello()constructor inicializa el marco llamando primero al constructor de la superclase, pasando el parámetro "Hello World", que se usa como título de la ventana. Luego llama al setDefaultCloseOperation(int)método heredado de JFramepara establecer la operación predeterminada cuando se selecciona el control de cierre en la barra de título a - esto hace que se elimine cuando se cierra el marco (en lugar de simplemente ocultarse), lo que permite que la máquina virtual de Java salga y el programa termine. Luego, se crea un para la cadena "Hello, world!" y se llama al método heredado de la superclase para agregar la etiqueta al marco. Se llama al método heredado de la superclase para dimensionar la ventana y organizar su contenido. Se llama al método heredado de la superclase con el parámetro booleano , lo que hace que se muestre el marco.WindowConstants.EXIT_ON_CLOSE JFrameJLabeladd(Component)Containerpack()WindowsetVisible(boolean)Componenttrue
main()La máquina virtual de Java llama a este método al iniciar el programa. Instancia un nuevo marco Hello. El código utiliza este invokeLater(Runnable)método para invocar el constructor del hilo de distribución de eventos de AWT , lo que garantiza una ejecución segura para subprocesos . Una vez que se muestra el marco, salir del mainmétodo no provoca la finalización del programa, ya que el hilo de distribución de eventos permanece activo hasta que se hayan eliminado todas las ventanas de nivel superior de Swing.
Ventana con botón

El siguiente es un programa bastante simple basado en Swing. Muestra una ventana (a JFrame) que contiene una etiqueta y un botón.
import java.awt.FlowLayout ; import javax.swing.JButton ; import javax.swing.JFrame ; import javax.swing.JLabel ; import javax.swing.WindowConstants ; import javax.swing.SwingUtilities ; public class SwingExample implements Runnable { @Override public void run () { // Crea la ventana JFrame f = new JFrame ( "Hello World!" ); // Establece el comportamiento para cuando se cierra la ventana f . setDefaultCloseOperation ( WindowConstants . EXIT_ON_CLOSE ); // Agrega un administrador de diseño para que el botón no se coloque encima de la etiqueta f . setLayout ( new FlowLayout ()); // Agrega una etiqueta y un botón f . add ( new JLabel ( "Hello, world!" )); f . add ( new JButton ( "¡Presiona!" )); // Organiza los componentes dentro de la ventana f.pack (); // Por defecto, la ventana no es visible. Hazla visible. f.setVisible ( true ) ; } public static void main ( String [] args ) { // Programa la ejecución de la aplicación en el momento correcto en la cola de eventos . SwingUtilities.invokeLater ( new SwingExample ( ) ) ; }}Observe cómo toda la instanciación y el manejo de componentes Swing se realizan implementando la interfaz Runnable. Esto se ejecuta en el hilo de despacho de eventos mediante el método SwingUtilities.invokeLater(Runnable)), creado en el método main (consulte Swing y seguridad de subprocesos ). Aunque el código Swing puede ejecutarse sin usar esta técnica (por ejemplo, no implementando Runnable y moviendo todos los comandos del método run al método main), se considera una buena práctica, ya que Swing no es seguro para subprocesos , lo que significa que invocar recursos desde múltiples subprocesos puede provocar interferencias entre subprocesos y errores de consistencia de memoria. [ 15 ]
Campo de texto
Los campos de texto permiten a los usuarios introducir texto o datos en tu aplicación. Crear un campo de texto en Swing es sencillo: crea una instancia de un objeto JTextField y añádelo a un contenedor.
import javax.swing.* ;public class TextFieldExample { public static void main ( String [] args ) { SwingUtilities . invokeLater (() -> { // Crear un JFrame JFrame frame = new JFrame ( "Ejemplo de campo de texto" );// Crea un JTextField JTextField textField = new JTextField ( 20 );// Agrega el campo de texto al JFrame frame.add ( textField ) ;// Establece el tamaño del JFrame y hazlo visible frame.setSize ( 300 , 200 ); frame.setVisible ( true ) ; }) ; } }Mejorar la funcionalidad de los campos de texto optimiza la interacción del usuario. Al integrar interfaces DocumentListener, puede supervisar dinámicamente los cambios en el contenido del texto, lo que permite la validación, el formato y el autocompletado de los datos de entrada en tiempo real.
La validación de la entrada en campos de texto es crucial para garantizar la integridad de los datos y prevenir errores. Swing ofrece múltiples técnicas de validación, incluyendo expresiones regulares, máscaras de entrada o lógica de validación personalizada. Al implementar interfaces InputVerifier, puede definir reglas de validación específicas y ofrecer retroalimentación inmediata a los usuarios cuando la entrada no sea válida. [ 16 ]
Otro ejemplo
En este ejemplo, sea javax.swing.JFrame la superclase y agregue nuestro(s) propio(s) widget(s) a ella (en este caso, un JButton).
import javax.swing.JFrame ; import javax.swing.JButton ; import javax.swing.JOptionPane ; import javax.swing.SwingUtilities ;import java.awt.event.ActionListener ; import java.awt.event.ActionEvent ;public class Sample extends JFrame { public Sample () { super (); this . setTitle ( "HelloApp" ); this . getContentPane (). setLayout ( null ); this . setBounds ( 100 , 100 , 180 , 140 ); this . add ( makeButton ()); this . setVisible ( true ); this . setDefaultCloseOperation ( EXIT_ON_CLOSE ); }private JButton makeButton () { final JButton b = new JButton (); b.setText ( " ¡ Haz clic aquí!" ) ; b.setBounds ( 40 , 40 , 100 , 30 ) ; b.addActionListener ( ( ActionEvent e ) - > JOptionPane.showMessageDialog ( b , " Hola Mundo!" ) ); return b ; }public static void main ( String [] args ) throws InvocationTargetException , InterruptedException { // Las llamadas de Swing deben ser ejecutadas por el hilo de despacho de eventos. SwingUtilities . invokeAndWait (() -> new Sample ()); } }El diseño se establece en nulo mediante este Container.setLayout(LayoutManager)método, ya que JFrame utiliza java.awt.BorderLayout como su administrador de diseño predeterminado. Con BorderLayout, cualquier elemento que se agregue al contenedor se coloca en el centro y se estira para acomodar otros widgets. La mayoría de las aplicaciones GUI reales prefieren usar un administrador de diseño en lugar de colocar todo en coordenadas absolutas. [ 17 ]
Véase también
- swingLabs – Extensiones para Swing
- Kit de herramientas de widgets estándar : un kit de herramientas de widgets de terceros mantenido por la Fundación Eclipse .
- JavaFX : una plataforma de software para crear y distribuir aplicaciones de escritorio y aplicaciones web enriquecidas que pueden ejecutarse en una amplia variedad de dispositivos, y que pretende ser el sucesor de Swing. JavaFX forma parte del proyecto OpenJFX . [ 18 ]
Referencias
Citas
- ↑ "¿Qué es Java Swing? - Definición de Techopedia" . Techopedia Inc. Consultado el 3 de noviembre de 2018 .
- ↑ Yap, Chee (30 de abril de 2003). "TUTORIAL DE GUI DE JAVA SWING" . Universidad de Nueva York (NYU) . Recuperado el 3 de noviembre de 2018 .
- 1 2 "Desarrollo de una aplicación GUI básica usando JavaFX en Eclipse" . Julio de 2017.
- ↑ "Sun y Netscape desarrollarán conjuntamente Java Foundation Classes" . Netscape Communications Corporation . 2 de abril de 1997. Archivado del original el 9 de mayo de 2012. Consultado el 8 de agosto de 2011 .
- ↑ "SUN LANZA LA PRÓXIMA VERSIÓN DE LA PLATAFORMA JAVA" . Sun Microsystems . Agosto de 2007. Archivado del original el 16 de agosto de 2007. Consultado el 8 de enero de 2012.
Las Java Foundation Classes son ahora fundamentales para la plataforma Java 2 e incluyen: el conjunto de componentes de interfaz gráfica de usuario Project Swing, la función de arrastrar y soltar, la API Java 2D que proporciona nuevas capacidades gráficas 2D y AWT, así como compatibilidad con impresión, la interfaz de apariencia Java y una nueva API de accesibilidad.
- ↑ Gabriela Motroc (8 de marzo de 2018). "Actualización de JDK 11: JavaFX se desacoplará del JDK" . Archivado del original el 26 de marzo de 2019.
- ↑ Smith, Donald (7 de marzo de 2018). "El futuro de JavaFX y otras actualizaciones de la hoja de ruta del cliente Java" .
- ↑ Zakhour, Sharon. "¿Por qué se llama Swing?" . El blog de tutoriales de Java . Consultado el 24 de septiembre de 2020 .
- ↑ John, Yu (27 de agosto de 2003). "Los clientes enriquecidos surgen como alternativas para las aplicaciones web" . ComputerWorld . Recuperado el 24 de septiembre de 2020 .
- ↑ Zukowski, John (21 de agosto de 2007). "Swing threading and the event-dispatch thread" . JavaWorld . Recuperado el 26 de julio de 2020 .
- ↑ Fowler, Amy. "Descripción general de la arquitectura Swing" . Sun Microsystems . Consultado el 26 de julio de 2020 .
- ↑ Zakhour, Sharon; Petrov, Anthony (abril de 2010). "Mezclando componentes pesados y ligeros" . Oracle . Recuperado el 26 de julio de 2020 .
- ↑ Strenn, Stephen (3 de marzo de 2006). "Rendimiento de Swing vs. SWT: un vistazo a las pilas de llamadas" . Javalobby . Archivado del original el 17 de septiembre de 2017.
- ↑ Žagar, Klemen; Križnar, Igor (3 de marzo de 2006). "Comparación de rendimiento SWT vs. Swing" (PDF) ( ed. 1.4). Cosylab. Archivado del original (PDF) el 26 de mayo de 2015.
Es difícil dar una regla general sobre dónde SWT superaría a Swing, o viceversa. En algunos entornos (p. ej., Windows), SWT es el ganador. En otros (Linux,
VMware
alojando Windows), Swing y su optimización de redibujado superan a SWT significativamente. Las diferencias de rendimiento son significativas: factores de 2 o más son comunes, en cualquier dirección.
- ↑ "El hilo de despacho de eventos" . docs.oracle.com .
- ↑ https://geeksprogramming.com/java-swing-tutorial-for-beginners/ El hilo de despacho de eventos
- ↑ Eckel, Bruce (2006). Pensando en Java (PDF) (4.ª ed.). Prentice Hall. pág. 942. ISBN 978-0131872486Archivado del original (PDF) el 14 de mayo de 2016. Consultado el 13 de mayo de 2016 .
- ↑ "Página principal para desarrolladores de JavaFX" . www.oracle.com .
Fuentes
- Matthew Robinson, Pavel Vorobiev: Swing, Segunda edición , Manning, ISBN 1-930110-88-X
- David M. Geary : Graphic Java 2, Volumen 2: Swing , Prentice Hall, ISBN 0-13-079667-0
- John Zukowski: La guía definitiva de Java Swing, tercera edición , Apress, ISBN 1-59059-447-9
- James Elliott, Robert Eckstein , Marc Loy , David Wood, Brian Cole: Java Swing , O'Reilly, ISBN 0-596-00408-7
- Kathy Walrath , Mary Campione , Alison Huml , Sharon Zakhour : El tutorial de JFC Swing: Una guía para construir interfaces gráficas de usuario , Addison-Wesley Professional, ISBN 0-201-91467-0
- Joshua Marinacci , Chris Adamson: Swing Hacks , O'Reilly, ISBN 0-596-00907-0
- Ivan Portyankin , Swing, Interfaces de usuario efectivas (en ruso) , 2.ª ed., 2010, Moscú, «Lory», ISBN 5-469-00005-2
Enlaces externos
- La documentación de la API de Swing
- Kits de herramientas de widgets
- Componentes JDK