Tres clases de ejemplo
Para el ejemplo he usado tres clases que he llamado:
- EjemploJFrame
- EjemploJDialog
- EjemploJInternalFrame
Lo primero a hacer es tener la última versión de Eclipse y de Java, a ser posible. A fecha de hoy tengo la versión juno de Eclipse y de Java la 1.7 update 9. Y creo un nuevo proyecto llamado JavaSwing3JugandoConVentanas.
Gran parte del código lo ha generado Eclipse, así que me he ahorrado mucho tiempo. En el explorador de proyectos, con el botón derecho, en la carpeta donde van a ir los código, le he dado a New… -> Other…
Me ha salido una ventana como la de la imagen de arriba, he hecho las tres clases con los nombre que he puesto antes y ya tengo listo el esqueleto del programa. He puesto las clases en el paquete por defecto, es decir, sin poner el package donde quiero que esten, por eso en el código no se ve la línea package…
La idea de éste tutorial es intentar hacer un programa como el de la primera imagen del post, mirando lo menos posible los códigos fuentes de abajo.
Un JFrame es la ventana pricipal del programa, debe haber sólo uno. Éste tiene icono, y sale en la barra de tareas. Sin embargo el JDialog pertenece a un JFrame, debe tener un padre, no tiene icono ni sale en la barra de tareas. Por otro lado el JInternalFrame corre dentro de otro panel, en éste caso he puesto el caso más habitual, que corra dentro de un JDesktopPane. Se pueden abrir muchos diálogos y también muchas ventanas internas. Las ventanas modales, impiden que el usuario toque nada hasta que termine en ésa ventana y la cierre. En líneas generales ésto son las diferencias.
El código siguiente hace todo ésto, piensa que casi todo el código me lo ha generado Eclipse. He tratado de resumir el ejemplo lo más posible, comentandolo, aquí está el código:
EjemploJFrame
import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class EjemploJFrame extends JFrame { private JPanel contentPane; // METODO PRINCIPAL QUE ARRANCA TODA LA APLICACIÓN public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { // crea el JFrame EjemploJFrame frame = new EjemploJFrame(); // lo hace visible frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } // EL CONSTRUCTOR QUE SE USA CUANDO ARRANCA AQUÍ ARRIBA public EjemploJFrame() { // el titulo de la ventana setTitle("Swing: Jugando con las ventanas by jnj"); // acción al cerrar el frame: sale del programa // en éste caso, terminando la ejecución setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // posición de las esquinas del formulario en tu escritorio setBounds(100, 100, 450, 433); // el panel que contiene todo contentPane = new JPanel(); // borde del panel contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); // se pone el panel en la ventana setContentPane(contentPane); // se establece disposición de las capas a null // para poder posicionar por coordenadas los componentes // ésto se hace con un Absolute Layout que se llama // en el diseñador visual contentPane.setLayout(null); // el botón que abre ventanas de diálogo JButton btnAbrirUnaVentana = new JButton( "Abrir una ventana de diu00E1logo con el usuario"); btnAbrirUnaVentana.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { EjemploJDialog dialogo = new EjemploJDialog(); dialogo.setVisible(true); } }); btnAbrirUnaVentana.setBounds(10, 11, 414, 23); contentPane.add(btnAbrirUnaVentana); // el botón que abre ventanas de diálogo // pero de manera MODAL JButton btnAbrirUnaVentana_1 = new JButton( "Abrir una ventana de diu00E1logo MODAL"); btnAbrirUnaVentana_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { EjemploJDialog dialogo = new EjemploJDialog(); dialogo.setModal(true); dialogo.setVisible(true); } }); btnAbrirUnaVentana_1.setBounds(10, 70, 414, 23); contentPane.add(btnAbrirUnaVentana_1); JLabel lblSiLaAbrimos = new JLabel( "Si la abrimos modal, hasta no cerrarla no podemos tocar u00E9sta ventana."); lblSiLaAbrimos.setBounds(10, 45, 414, 14); contentPane.add(lblSiLaAbrimos); // el panel-escritorio donde veremos los JFrames internos final JDesktopPane desktopPane = new JDesktopPane(); desktopPane.setBounds(10, 138, 414, 246); contentPane.add(desktopPane); // botón para abrir las ventanas internas JButton btnAbrirUnJframe = new JButton( "Abrir un JFrame interno aquu00ED abajo"); btnAbrirUnJframe.addActionListener(new ActionListener() { // variable para que cada nueva ventana interna // salga en diferente posición y se vean todas int posicioninicial = 0; public void actionPerformed(ActionEvent e) { EjemploJInternalFrame jif = new EjemploJInternalFrame(); jif.setVisible(true); // posición de la nueva ventana jif.setLocation(posicioninicial, posicioninicial); // las siguiente posición será diferente así // veremos todas las ventanas internas posicioninicial += 10; desktopPane.add(jif); } }); btnAbrirUnJframe.setBounds(10, 104, 414, 23); contentPane.add(btnAbrirUnJframe); } }
EjemploJDialog
import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.EmptyBorder; // AQUÍ EMPIEZA LA CLASE public class EjemploJDialog extends JDialog { private final JPanel contentPanel = new JPanel(); /* ESTO LO GENERA ECLIPSE PARA PROBAR MIENTRAS CONSTRUIMOS * EL DIALOGO, LO PODEMOS DESCOMENTAR PARA * PROBAR EL DIÁLOGO SIN PROBAR TODA LA APLICACIÓN COMPLETA public static void main(String[] args) { try { EjemploJDialog dialog = new EjemploJDialog(); dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.setVisible(true); } catch (Exception e) { e.printStackTrace(); } }*/ // CONSTRUCTOR DE LA CLASE // crea la ventana, con los bordes, botones, // y todos los componentes internos para hacer lo que // se pretenda con éste diálogo. public EjemploJDialog() { // evita cambio de tamaño setResizable(false); // título del diáolog setTitle("u00C9sto es una ventana de diu00E1logo"); // dimensiones que ocupa en la pantalla setBounds(100, 100, 450, 229); // capa que contendrá todo getContentPane().setLayout(new BorderLayout()); // borde de la ventan contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); // pone el panel centrado getContentPane().add(contentPanel, BorderLayout.CENTER); // sin capas para poder posicionar los elementos por coordenadas contentPanel.setLayout(null); { // aquí se pone el JTextArea dentro de un JScrollPane // para que tenga barras de desplazamiento JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 11, 424, 146); contentPanel.add(scrollPane); { JTextArea txtrstoEsUn = new JTextArea(); txtrstoEsUn.setText("u00C9sto es un JTextArea, aquu00ED podemos poner un texto de varias lu00EDneas.rn1rn2rn3rn..rnrnObserva que no se ve en la barra de tareas que exista u00E9sta ventana. Si fuera un JFrame su00ED que se veru00EDa en la barra de tareas con el texto del tu00EDtulo de la ventana...rnrnEl componente JTextArea estu00E1 dentro de un JScrollPane para que se visualizen las barras de scroll cuando sea necesario.rnrnLa ventana tiene el atributo 'resizable' a 'false' para evitar que se pueda cambiar el tamau00F1o.rnrnrnrnrnrnFin del texto."); txtrstoEsUn.setLineWrap(true); txtrstoEsUn.setAutoscrolls(true); scrollPane.setViewportView(txtrstoEsUn); } } { // a continuación tenemos los botones clásicos 'Vale' y 'Cancela' // éste código lo ha generado Eclipse... JPanel buttonPane = new JPanel(); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, BorderLayout.SOUTH); { JButton okButton = new JButton("Vale"); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // aquí van las acciones al hacer click en Vale // envía el diálogo al recolector de basura de Java dispose(); } }); okButton.setActionCommand("Vale"); buttonPane.add(okButton); getRootPane().setDefaultButton(okButton); } { JButton cancelButton = new JButton("Cancelar"); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { // aquí van las acciones al hacer click en Vale // envía el diálogo al recolector de basura de Java dispose(); } }); cancelButton.setActionCommand("Cancelar"); buttonPane.add(cancelButton); } } } }
EjemploJInternalFrame
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JInternalFrame; import javax.swing.JLabel; public class EjemploJInternalFrame extends JInternalFrame { /* ÉSTE MAIN LO GENERA ECLIPSE PARA PRUEBAS, LO DEJO * COMENTADO PORQUE YA ESTÁ FUNCIONANDO Y SE EJECUTARÁ * DENTRO DE UN JDesktopPane COMO TODO BUEN JInternalFrame * TAMBIÉN SE PUEDE EJECUTAR DENTRO DE OTROS PANELES * PERO ESO NO SE SUELE UTILIZAR. public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { EjemploJInternalFrame frame = new EjemploJInternalFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }*/ // ÉSTE ES EL CONSTRUCTOR DE LA CLASE public EjemploJInternalFrame() { // coordenadas con las dimensiones de la ventana setBounds(100, 100, 245, 134); // disposición de capas a nulo para poder posicionar // con coordenadas en vez de con el esquema determinado getContentPane().setLayout(null); // un etiqueta... JLabel lblstoEsUna = new JLabel("u00C9sto es una ventana interna..."); lblstoEsUna.setBounds(10, 11, 333, 14); getContentPane().add(lblstoEsUna); // el botón que cierra ésta ventana interna JButton btnAprietaAquPara = new JButton("Aprieta aquu00ED para cerrar"); btnAprietaAquPara.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // ésto se ejecuta cuando se aprieta el botón // manda la clase a la basura, // con lo que se cierra la ventana dispose(); } }); btnAprietaAquPara.setBounds(10, 36, 209, 58); getContentPane().add(btnAprietaAquPara); } }
Terminando
Puedes copiar éstos códigos cada uno en su fichero .java correspondiente: EjemploJFrame.java, EjemploJDialog.java y EjemploJInternalFrame.java. El fichero que arranca toda la aplicación es EjemploJFrame.java. Sólo necesitas el JRE para ejecutarlo.
Me volví un poco loco aprendiendo ésto, así que si te he aclarado las ideas, o has aprendido algo, estoy satisfecho.
¡Un saludo!
Era justo lo que buscaba! Recién estoy aprendiendo, mi tío necesitaba una aplicación de pc para su taller y asumí el reto de hacérsela yo mismo.
El problema era que para crear dos ventanas estaba creando dos JFrame, y eso me traía un montón de problemas que no sabia resolver.
Ahora con esto tengo las ideas mas claras que el agua! Un grande!
Un saludo y muchísismas gracias!
Genial Emiliano! Me alegro de que te haya servido este post para tu propósito de continuar desarrollando esa aplicación!
Java es un lenguaje muy potente. Te animo a que sigas investigando en Java Swing, cualquier cosa que hayas visto en otros programas de gestión se puede hacer también en Java.
Gracias por tu comentario!
Gran post. Estoy luchando con muchas de estas cosas ahora mismo..
Gracias Nguyen!
Realizar un programa con el siguiente menú.
Dentro de calcular estará sumar, multiplicar y restar y dentro de ellos los demás que aparecen después del signo de mayor> y al presionarlo salga otra ventana para permitirme realizar eso.
Al realizar el calculo debe guardarse en la tabla el resultado. La tabla de ejemplo esta debajo
Calcular>SUMAR
SUMAR>DOSNUMERO
SUMAR>TRES NUMEROS
quien me ayuda con ese ejercicio
Hola Gabriela!
En este post tienes cómo hacer menús:
https://jnjsite.com/java-swing-5-preparando-el-menu-para-estas-navidades/
Aquí cómo poner cajas y botones en las ventanas para poner los números y lanzar los cálculos:
https://jnjsite.com/java-swing-6-los-componentes-basicos/
Y aquí cómo hacer una tabla para la ventana principal, y recibir los resultados:
https://jnjsite.com/java-swing-10-jtable-segunda-parte-un-poco-mas-sobre-tablas/
Un saludo!