La manera más simple de implementar una ventana independiente en Java es partiendo de un objeto JFrame, que es una ventana que puede tener borde y barra de título con botones de maximizar / minimizar / cerrar

Se proponen 3 formas muy sencillas de implementar una ventana:
Ventana1: clase que hereda de JFrame, en ella se crea una instancia de JFrame que se configura y se muestra; todo el código va incluido dentro del método main() (único método de la clase).
Ventana2: clase que hereda de JFrame, con un método constructor de la propia clase que es el que crea y muestra la ventana, el método main() simplemente instancia un ejemplar de la clase
Ventana3: como el ejemplo anterior pero añadiendo una etiqueta y un botón que cierra el programa cuando es pulsado (imagen al principio del artículo).
Ventana1
// VENTANA SENCILLA A PARTIR DE JFRAME
import java.awt.*;
import javax.swing.*;
// CLASE PRINCIPAL DEL PROGRAMA (hereda de JFrame)
public class Ventana1 extends JFrame {
// METODO DE ENTRADA AL PROGRAMA
public static void main(String args[]) {
// crear y configurar la ventana
JFrame frame = new JFrame("Ventana desde JFrame");
// accion por defecto al cerrar la ventana: salir del programa
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel1 = new JPanel();
/* para agregar un panel a un JFrame es preferible
* ventana.getContentPane().add(panel1);
* en lugar de
* ventana.add(panel1); */
frame.getContentPane().add(panel1);
// mostrar la ventana
frame.setSize(340,240); // dimensiones
frame.setLocation(200,200); // posicion
frame.setResizable(false); // no cambia dimensiones
frame.setVisible(true); // mostrarla
}
}
Ventana2
// VENTANA SENCILLA A PARTIR DE UN JFRAME
import java.awt.*;
import javax.swing.*;
// CLASE PRINCIPAL DEL PROGRAMA (hereda de JFrame)
public class Ventana2 extends JFrame {
// variables a nivel de clase
private JPanel panel1;
// METODO DE ENTRADA AL PROGRAMA
public static void main(String args[]) {
// instancia de la clase principal
new Ventana2();
}
// METODO CONSTRUCTOR QUE CREA Y MUESTRA LA INTERFAZ
// Ventana2 hereda las caracteristicas de JFrame
public Ventana2() {
/* la variable especial this se usa en metodos de instancia
* para hacer referencia al objeto que contiene al metodo,
* aqui equivale a JFrame */
// accion por defecto al cerrar la ventana: salir del programa
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// la ventana
this.setTitle("Ventana desde JFrame");
this.setSize(340, 240);
this.setLocation(200,200);
this.setResizable(false);
this.setVisible(true);
}
}
Ventana3
// VENTANA SENCILLA A PARTIR DE UN JFRAME
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// CLASE PRINCIPAL DEL PROGRAMA (hereda de JFrame)
public class Ventana3 extends JFrame {
// variables a nivel de clase
private JPanel panel1;
private JButton bt;
private JLabel label;
// METODO DE ENTRADA AL PROGRAMA
public static void main(String args[]) {
// instancia de la clase principal
new Ventana3();
}
// METODO CONSTRUCTOR QUE CREA Y MUESTRA LA INTERFAZ
// Ventana3 hereda las caracteristicas de JFrame
public Ventana3() {
/* la variable especial this se usa en metodos de instancia
* para hacer referencia al objeto que contiene al metodo,
* aqui equivale a JFrame */
// accion por defecto al cerrar la ventana: salir del programa
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/* panel contenido en la ventana, BorderLayout es uno de los tipos de disposicion
* de los paneles, tiene 5 zonas: NORTH, WEST, CENTER, EAST, SOUTH */
panel1 = new JPanel(new BorderLayout());
// etiqueta y boton contenidos en el panel
// etiqueta con texto alineado al centro en horizontal
label = new JLabel("Ventana con etiqueta y bot\u00f3n", SwingConstants.CENTER);
Font letra1 = new Font("Verdana", Font.PLAIN, 18);
label.setFont(letra1);
label.setForeground(Color.blue);
bt = new JButton("Salir");
Font letra2 = new Font("Verdana", Font.BOLD, 12);
bt.setFont(letra2);
/* asociar el boton con una instancia de la clase Cerrar
* para configurar la accion al pulsar en el boton */
bt.addActionListener (new Cerrar());
/* colocar los componentes en los paneles;
* para agregar un componente a un JFrame es preferible
* ventana.getContentPane().add(panel1);
* en lugar de
* ventana.add(panel1); */
this.getContentPane().add(panel1);
panel1.add(label, BorderLayout.CENTER);
panel1.add(bt, BorderLayout.SOUTH);
// la ventana
this.setTitle("Ventana desde JFrame");
this.setSize(340,240);
this.setLocation(200,200);
this.setResizable(false);
this.setVisible(true);
}
//CERRAR EL PROGRAMA AL PULSAR EL BOTON bt
//el boton bt se asocia con una instancia de la clase Cerrar
//en la clase Cerrar estan definidos el evento y la accion que se va a realizar
class Cerrar implements ActionListener {
public void actionPerformed(ActionEvent evt) {
System.exit(0); }
}
}
