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); } } }