swingEmpezando con el swing


Observaciones

Swing ha sido reemplazado por JavaFX . Oracle generalmente recomienda desarrollar nuevas aplicaciones con JavaFX. Aún así: Swing será compatible con Java en el futuro inmediato. JavaFX también se integra bien con Swing, para permitir la transición de las aplicaciones sin problemas.

Se recomienda encarecidamente tener la mayoría de sus componentes Swing en el subproceso de despacho de eventos. Es fácil olvidarse de agrupar la configuración de su GUI en una llamada invokeLater . De la documentación de Java:

El código de manejo de eventos Swing se ejecuta en un subproceso especial conocido como el subproceso de distribución de eventos. La mayoría del código que invoca los métodos Swing también se ejecuta en este hilo. Esto es necesario porque la mayoría de los métodos de objetos Swing no son "seguros para subprocesos": invocarlos desde múltiples subprocesos puede provocar interferencias en los subprocesos o errores de consistencia de la memoria. Algunos métodos de componentes Swing están etiquetados como "seguro para subprocesos" en la especificación de la API; Estos pueden ser invocados de forma segura desde cualquier hilo. Todos los demás métodos del componente Swing deben invocarse desde el hilo de despacho de eventos. Los programas que ignoran esta regla pueden funcionar correctamente la mayor parte del tiempo, pero están sujetos a errores impredecibles que son difíciles de reproducir.

Además, a menos que sea por una buena razón, siempre asegúrese de llamar a setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) o de lo contrario podría tener que lidiar con una pérdida de memoria si olvida destruir la JVM.

"¡Hola Mundo!" en titulo de ventana con compatibilidad

Usando java.lang.Runnable hacemos nuestro "¡Hola mundo!" Ejemplo disponible para usuarios de Java con versiones que se remontan a la versión 1.2:

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Main {
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run(){
                JFrame frame = new JFrame("Hello World!");
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setSize(200, 100);
                frame.setVisible(true);
            }
        });
    }
}
 

"¡Hola Mundo!" en titulo de ventana con lambda

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Hello World!");
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setSize(200, 100);
            frame.setVisible(true);
        });
    }
}
 

Dentro del método main :
En la primera línea se llama a SwingUtilities.invokeLater pasa una expresión lambda con un bloque de código () -> {...} . Esto ejecuta la expresión lambda pasada en la EDT, que es la abreviatura de Subproceso de distribución de eventos, en lugar del subproceso principal. Esto es necesario, porque dentro del bloque de código de la expresión lambda, hay componentes de Swing que se crearán y actualizarán.

Dentro del bloque de código de la expresión lambda:
En la primera línea, una nueva instancia de JFrame llamada frame se crea utilizando el new JFrame("Hello World!") . Esto crea una instancia de ventana con "Hello World!" en su título. Luego, en la segunda línea, el frame se configura como EXIT_ON_CLOSE . De lo contrario, la ventana se cerrará, pero la ejecución del programa permanecerá activa. La tercera línea configura la instancia de frame para que tenga 200 píxeles de ancho y 100 píxeles de altura utilizando el método setSize . Hasta ahora la ejecución no mostrará nada en absoluto. Solo después de llamar a setVisible(true) en la cuarta línea, la instancia de frame está configurada para aparecer en la pantalla.

Incrementando con un botón.

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * A very simple Swing example.
 */
public class SwingExample {
    /**
     * The number of times the user has clicked the button.
     */
    private long clickCount;
    
    /**
     * The main method: starting point of this application.
     *
     * @param arguments the unused command-line arguments.
     */
    public static void main(final String[] arguments) {
        new SwingExample().run();
    }

    /**
     * Schedule a job for the event-dispatching thread: create and show this
     * application's GUI.
     */
    private void run() {
        SwingUtilities.invokeLater(this::createAndShowGui);
    }
    
    /**
     * Create the simple GUI for this application and make it visible.
     */
    private void createAndShowGui() {
        // Create the frame and make sure the application exits when the user closes
        // the frame.
        JFrame mainFrame = new JFrame("Counter");
        mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        // Add a simple button and label.
        JPanel panel = new JPanel();
        JButton button = new JButton("Click me!");
        JLabel label = new JLabel("Click count: " + clickCount);
        panel.add(button);
        panel.add(label);
        mainFrame.getContentPane().add(panel);
        
        // Add an action listener to the button to increment the count displayed by
        // the label.
        button.addActionListener(actionEvent -> {
            clickCount++;
            label.setText("Click count: " + clickCount);
        });
        
        // Size the frame.
        mainFrame.setBounds(80, 60, 400, 300);
        //Center on screen
        mainFrame.setLocationRelativeTo(null);
        //Display frame
        mainFrame.setVisible(true);
    }
}
 

Resultado

Como el botón etiquetado "Haga clic en mí!" se presiona el número de clics aumentará en uno:

Programa corriente