60
Introducción a Interfaces Gráficas Por: Gilberto Pacheco Gallegos Copyright © 2008 Gilberto Pacheco Gallegos

Java Grafico

Embed Size (px)

Citation preview

Page 1: Java Grafico

Introducción a Interfaces

Gráficas

Por: Gilberto Pacheco Gallegos

Copyright © 2008 Gilberto Pacheco Gallegos

Page 2: Java Grafico

Índice1. Conceptos Básicos.................................................................................................................................1

1.1. Objetos y Propiedades....................................................................................................................11.2. Tipos de Ventanas...........................................................................................................................21.3. Construcción de Interfaces Gráficas en Java..................................................................................31.4. Componentes Gráficos...................................................................................................................31.5. Abstract Window Toolkit (AWT)...................................................................................................41.6. Swing..............................................................................................................................................41.7. Propiedades....................................................................................................................................41.8. Eventos...........................................................................................................................................51.9. Primer Programa.............................................................................................................................5

1.9.1. Ventana...................................................................................................................................51.9.2. Salida de Texto............................................................................................................................5

1.9.3. Código Fuente.........................................................................................................................61.10. Layouts.........................................................................................................................................71.11. Interfaz1........................................................................................................................................8

1.11.1. Ventana..................................................................................................................................81.11.2. Código Fuente.......................................................................................................................8

1.12. Interfaz2......................................................................................................................................101.12.1. Ventana...............................................................................................................................101.12.2. Código Fuente.....................................................................................................................11

2. Componenentes Básicos......................................................................................................................132.1. Cuadros de Texto Con Formato (Enteros)....................................................................................13

2.1.1. Ventana.................................................................................................................................132.1.2. Código Fuente.......................................................................................................................13

2.2. Texto con Formato (Números en General)...................................................................................162.2.1. Ventana.................................................................................................................................162.2.2. Código Fuente.......................................................................................................................16

2.3. Texto con Formato (Fechas).........................................................................................................192.3.1. Ventana.................................................................................................................................192.3.2. Código Fuente.......................................................................................................................19

2.4. Cuadros Combinados...................................................................................................................222.4.1. Ventana.................................................................................................................................222.4.2. Código Fuente.......................................................................................................................23

2.5. Listas.................................................................................................................................................252.5.1. Ventana.................................................................................................................................252.5.2. Código Fuente.......................................................................................................................25

3. Tablas...................................................................................................................................................273.1. Tablas con Arreglos Bidimensionales..........................................................................................27

3.1.1. Ventana.................................................................................................................................273.1.2. Código Fuente.......................................................................................................................28

3.2. Tablas con Arreglos de referencias...............................................................................................313.2.1. Código Fuente de “Proveedor.java”.....................................................................................313.2.2. Código Fuente de “Tabla2.java”...........................................................................................32

4. Cuadros de Diálogo..............................................................................................................................364.1. Cuadros de Diálogo Predefinidos................................................................................................36

Page 3: Java Grafico

4.1.1. Ventana.................................................................................................................................364.1.2. Código Fuente.......................................................................................................................37

4.2. Cuadros de Selección de Color....................................................................................................404.2.1. Ventana.................................................................................................................................404.2.2. Código Fuente.......................................................................................................................41

4.3. Areas de Texto y Diálogos de Impresión.....................................................................................424.3.1. Ventana.................................................................................................................................424.3.2. Código Fuente.......................................................................................................................43

5. Layouts.................................................................................................................................................455.1. FlowLayout..................................................................................................................................45

5.1.1. Ventana.................................................................................................................................465.1.2. Código Fuente.......................................................................................................................46

5.2. BorderLayout................................................................................................................................475.2.1. Ventana.................................................................................................................................475.2.2. Código Fuente.......................................................................................................................47

5.3. GridBagLayout.............................................................................................................................485.3.1. Ventana.................................................................................................................................505.3.2. Código Fuente.......................................................................................................................50

5.4. Clase de Ayuda para GridBagLayout...........................................................................................515.4.1. Ventana.................................................................................................................................515.4.2. Código Fuente de “GBC.java”.............................................................................................525.4.3. Código Fuente de “GridBagLayout2.java”...........................................................................54

Page 4: Java Grafico
Page 5: Java Grafico

Introducción a Interfaces Gráficas

1. Conceptos Básicos.Hoy en día los gráficos por computadora son el principal medio de comunicación entre usuarios y computadoras, debido a su facilidad de uso. Pues los diferentes recursos disponibles de representan con imágenes que pueden controlarse con dispositivos de etrada tales como teclado, mouse, pantallas sensitivas al contacto etc.

El punto de entrada en la interacción del usuario con la computadora es el escritorio (desktop), donde se puede usar la información almacenada en carpetas(folders) y documentos, que se administran mediante programas de aplicación y herramientas.

El escritorio también nos da acceso a programas de aplicación y herramientas para manipular la información de la computadora. Cuando los ejecutamos se despliegan en áreas de la pantalla (ventanas) que hacen un fuerte uso de gráficos. Cuando están bien diseñadas son fáciles de aprender y requieren poca escritura.

1.1. Objetos y Propiedades.Las ventanas pueden desplegar objetos de la interfaz de usuarios. Un objeto es una entidad lógica que la aplicación despliega y el usuario manipula. Por ejemplo, en una aplicación de procesamiento de texto tenemos párrafos y palabras. Representan datos y partes de las labores que realiza el usuario.

Los objetos tienen características que definen su comportamiento, llamadas propiedades. Por ejemplo, una párrafo puede tener una propiedad llamada font, que determina el tipo de letra utilizado. Los usuarios normalmente pueden ver el valor asignado a las propiedades y modificarlo.

Las vistas son diferentes formas de desplegar objetos y sus caracterísiticas, como son listas de elementos, tablas de propiedades o íconos.

1

Page 6: Java Grafico

1.2. Tipos de Ventanas.● Ventanas Primarias. Aquellas donde el usuario realiza principalmente la interacción con los

datos o documentos. Una aplicación puede tener una o más de estas ventanas y se manejan de forma independiente. Representan un objeto (por ejemplo un documento de texto) o un conjunto de objetos (como el contenido de una carpeta). Normalmente contienen los siguientes elementos.

○ Barra de título. Despliega texto que incluye el nombre del objeto o conjunto de objetos que la ventana representa y el nombre de la aplicación.

○ Barra de menú. Es opcional y despliega una lista de opciones para ser elegidas. Típicamente los menú se agrupan de foma lógica para que el usuario no memorice todas las órdenes disponibles.

○ Barra de herramientas. Es opcional y contiene una colección de las órdenes o de opciones usadas más frecuentemente. Normalmente aparecen horizontalmente debajo de la barra de menú de una ventana primaria, pero puede arrastrarse a cualquier parte de la ventana. Normalmente contienen una combinación de los siguientes controles:

■ Botones de orden. Por ejemplo, los botones para guardar o imprimir documentos.

■ Controles para elegir modos de interacción. Por ejemplo, para seleccionar alguna herramienta de dibujo.

■ Controles que cambian y despliegan dinámicamente las propiedades de objetos. Por ejemplo, los botones que muestran si cierto caracter está en negrilla o en itálica.

○ Barra de estado. Es opcional y despliega mensajes sobre lo que está sucediendo en la aplicación e información sobre el el objeto representado por la ventana.

● Ventanas Secundarias. Son auxiliares y dependen de la ventana principal o de otra ventana secundaria. Se clasifican en:

○ Ventanas de alerta. Permiten una interacción breve con el usuario, por ejemplo desplegando mensajes de error o avisar sobre problemas potenciales.

○ Cuadros de diálogo. A su vez se clasifican en:

■ Ventanas de propiedades. Normalmente son abiertas desde otras ventanas donde se muestran objetos y permiten al usuario desplegar o asignar las propiedades de uno o más objetos.

■ Ventanas de acción. Normalmente son abiertas desde otras ventanas donde se solicita realizar una acción. Solicitan al usuario información necesaria para realizar esa acción (por ejemplo, para abrir un archivo).

● Ventanas de Utilerías. Despliegan un conjunto de herramiantas (por ejemplo, las herramientas de dibujo) o permiten otro tipo de interacción que tiene efecto sobre una ventana primaria activa. Permanecen abiertas aún cuando las ventanas primarias se cierran o minimizan. Un ejemplo son las ventanas de herramientas usadas para seleccionar alguna herramienta gráfica.

● Ventanas Planas. No tienen barras de título ni controles de ventana. Se usan típicamente para

2

Page 7: Java Grafico

Introducción a Interfaces Gráficas

pantallas de bienvenida, que se muestran brevemente mientras la aplicación inicia y despliega la ventana primaria.

1.3. Construcción de Interfaces Gráficas en Java.Para construir interfaces gráficas desde el lenguaje de programación Java es necesario conocer los siguietnes temas:

● Objetos y referencias.

● Constructores.

● Interfaces.

● Clases anónimas.

● Herencia.

● Arreglos de referencias.

● Manejo de excepciones.

1.4. Componentes Gráficos.Cada uno de los elementos de una interfaz gráfica es conocido como componente gráfico. Normalmente cada sistema operativo proporciona un juego de ellos. Los más comunes son:

● Etiquetas. Representan texto fijo.

● Botones.

● Campos de texto.

● Cuadros combinados.

● Listas.

● Tablas (también conocidos como grids, rejillas en español).

A cada componete gráfico le corresponde una clase. Por ejemplo, para construir ventanas primarias podemos usar la clase javax.swing.JFrame con una instrucción como la siguiente:JFrame r = new JFrame();

3

Page 8: Java Grafico

1.5. Abstract Window Toolkit (AWT).Desde su origen, Java cuenta con la librería AWT, que contiene clases que se apoyan fuertamente en el sistema operativo. Para cada componente gráfico se define una clase que corresponde a un tipo de objeto proporcionado por el sistema operativo. Tiene el problema de que la cantidad de componentes es muy pobre y que estos no se comportan igual en distintos sistemas operativos, lo cual hace complica el diseño de aplicaciones que deban correr sobre diferentes plataformas.

1.6. Swing.Swing es una librería más reciente, donde cada componente es dibujado y controlado directamente por Java. De esta forma se puede tener un juego más amplio de componentes y con un comportamiento más uniforme entre distintas plataformas. Está construido sobre AWT.

1.7. PropiedadesCada componente de la interfaz gráfica corresponde normalmente a una clase en Java.

Una propiedad es una característica de un objeto, cuyo valor controla un aspecto del comportamiento de dicho objeto. A cada propiedad le corresponden dos métodos:

● Un método para asignar la propiedad, que empieza con set. Por ejemplo al texto de la barra de título de una ventana primaria le corresponde a la propiedad title y se asigna invocando al método setTitle. Si se toma el ejemplo del punto anterior, se puede usar la siguiente instrucción:

r. setTitle(“Programa X”);● Un método para obtener la propiedad, que empieza con set o con is en el caso de devolver un

valor booleano. Por ejemplo, el método getTitle devuelve el título de una ventana primaria y el método isEnabled indica si puede procesar. Por lo mismo es posible escribir las siguientes instrucciones:

String t = r.getTitle(); boolean e = r.isEnabled();

Cuando una propiedad no tiene definido el método set, se dice que es una propiedad de solo lectura.

4

Page 9: Java Grafico

Introducción a Interfaces Gráficas

1.8. Eventos.Los eventos son sucesos que afectan a un componente gráfico y que pueden ser detectados. Por ejemplo, cuando se quiere cerrar una ventana. Como respuesta, pueden notificar a otros objetos, llamados listeners, de la presencia de estos eventos. Para ello, los objetos a los que se comunican deben implementar registrarse con el componente gráfico. En el siguiente ejemplo, se registra un objeto para ser notificado cuando se quiera cerrar una ventana primaria.r.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.out.println(“Adios”); }});En este ejemplo, el operador new nos permite crear un objeto de la clase WindowAdapter, que por definición implementa la interfaz WindowListener. Cuando se quiere cerrar una ventana, se invoca el método windowClosing de los objetos registrados. En este caso, se mostrará el mensaje “Adios” en la salida de texto. El objeto apuntado por evt contiene una descripción del evento windowClosing.

1.9. Primer Programa.Este programa ilustra todos los temas tocados en este capítulo.

1.9.1. Ventana.

1.9.2. Salida de Texto12

Adios

5

Page 10: Java Grafico

1.9.3. Código Fuente.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950

import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JFrame;import javax.swing.SwingUtilities;public class Primero { public static void main(String[] args) { /* * Crea un objeto que implementa la interface Runnable. Esta * instancia se pasa como parámetro a invokeLater; este método envía * el objeto al hilo de swing, donde se ejecuta el método run en el * momento que el sistema gráfico determine más adecuado. */ SwingUtilities.invokeLater(new Runnable() { public void run() { // Crea una ventana principal con título "Interfaz 1" JFrame r = new JFrame(); /* * Se define la propiedad title para mostrar título "Programa * X" */ r.setTitle("Programa X"); /* * Indica que la aplicación termina cuando se cierra la * ventana. */ r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* * Se define el tamaño de la ventana: 200 pixeles verticales * por 100 horizontales. */ r.setSize(200, 100); /* * Conecta la ventana con un objeto es notificado cuando se * quiere cerrar la ventana. */ r.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.out.println("Adios"); } }); /* * Muestra la ventana al definir la propiedad visible como * true. */ r.setVisible(true); } }); }}

6

Page 11: Java Grafico

Introducción a Interfaces Gráficas

1.10. Layouts.Para colocar los componentes en una ventana normalmente se usa un panel de componentes de la clase javax.swing.JPanel. Para organizar su contenido, generalmente se ayuda de objetos llamados layouts. Hay distintas clases de layouts, especializadas en diferentes formas de organizar componentes. A continuación enlistamos algunas clases que cumplen esta función:

● GridLayout – Coloca los componentes en una rejilla compuesta de celdas del mismo tamaño. Cada componente ocupa una cola celda.

● FlowLayout – Coloca los componentes horizontalmente.

● BorderLayout – Coloca los componentes en cinco posiciones, que son arriba, abajo, izquierda, derecha y al centro.

● GridBagLayout – Coloca los componentes en una rejilla compuesta de celdas de diferente tamaño. Cada componente puede ocupar más de una celda

El que nos permite disponer componentes de una forma más variada, manteniendo un estilo bastante simple de programar es java.awt.Grid Layout.Tiene diferentes Constructores:

public GridLayout( )Descripción:Crea una rejilla de un solo renglón.

public GridLayout(int renglones, int columnas)Descripción:Crea una rejilla con el número especificado de renglones y columnas. Todos los componentes se despliegan del mismo tamaño. Alguno de los parámetros puede ser cero, pero no ambos.

Parámetros:renglones – el número de renglones; cuando es cero representa cualquier número de renglones.

columnas – el número de columnas; cuendo es cero representa cualquier número de columnas.

public GridLayout(int renglones, int columnas, int sepHorizontal, int sepVertical)Descripción:Crea una rejilla con el número especificado de renglones y columnas. Todos los componentes se despliegan del mismo tamaño. También se especifica separación horizontal entre las columnas y la distancia vertical entre los renglones. Los renglones y las columnas pueden ser cero, pero no ambos.

7

Page 12: Java Grafico

Parámetros:renglones – el número de renglones; cuando es cero representa cualquier número de renglones.

columnas – el número de columnas; cuendo es cero representa cualquier número de columnas.

sepHorizontal – separación horizontal entre columnas.

sepVertical – separación vertical entre renglones.

1.11. Interfaz1.Una interfaz gráfica normalmente consta de una ventana principal donde se despliega una forma, que contiene mecanismos para indicar:

● La información hay que ingresar

● Procesar

● Para mostrar resultados.

Nota que el programa no se escribe en orden de procesamiento, sino asignando valor a las propiedades de los objetos involucrados y el código para procesar eventos.

1.11.1. Ventana.

1.11.2. Código Fuente.12345678910111213

import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.SwingUtilities;/** * Ejemplo de como crear un panel. Implementa la interfaz ActionListener pues * procesa eventos de acción

8

Page 13: Java Grafico

Introducción a Interfaces Gráficas

141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

*/public class Interfaz1 extends JPanel implements ActionListener { /** * Referencia constante llamada lblNombre que apunta a una etiqueta cuyo * texto es "Nombre". */ private final JLabel lblNombre = new JLabel("Nombre:"); /** * Referencia constante llamada txtNombre que apunta a un cuadro de texto * sin formato que debe mostrar al menos 10 caracteres. */ private final JTextField txtNombre = new JTextField(10); private final JLabel lblSaludo = new JLabel("Saludo:"); private final JTextField txtSaludo = new JTextField(17); /** * Referencia constante llamada btnSaludo que apunta a un botón cuyo * texto es "Saludo". */ private final JButton btnSaludo = new JButton("Saludo"); { /* * Notifica a este objeto cada vez que se hace clic en btnSaludo. */ btnSaludo.addActionListener(this); } public Interfaz1() { /* * Asigna al panel una disposición en rejilla de 3 renglones y 2 * columnas. */ setLayout(new GridLayout(3, 2)); /* * Agrega las referencias a los objetos que se despliegan en el * panel. Los objetos van llenando el primer renglón de izquierda a * derecha, luego el segundo, y así sucesivamente. */ add(lblNombre); add(txtNombre); add(lblSaludo); add(txtSaludo); add(btnSaludo); } /** * Método invocado cada vez que se hace clic en btnSaludo. * * @param evt * referencia al objeto que describe lo que sucedió al hacer * clic */ public void actionPerformed(ActionEvent evt) { /* * Obtiene el texto que está capturado en txtNombre usando el método * getText y elimina los espacios en blanco al inicio y al final * usando el método trim.

9

Page 14: Java Grafico

6869707172737475767778798081828384858687888990919293949596979899

100101102103104105106

*/ String saludo = "Hola " + txtNombre.getText().trim(); /* * Asigna el texto a mostrar en txtSaludo con el método setText. */ txtSaludo.setText(saludo); } public static void main(String[] args) { /* * Crea un objeto que implementa la interface Runnable. Esta * instancia se pasa como parámetro a invokeLater; este método envía * el objeto al hilo de swing, donde se ejecuta el método run en el * momento que el sistema gráfico determine más adecuado. */ SwingUtilities.invokeLater(new Runnable() { public void run() { // Crea una ventana principal con título "Interfaz 1" JFrame ventana = new JFrame("Interfaz 1"); /* * Asigna como contenida de la ventana una instancia de * Interfaz1. */ ventana.setContentPane(new Interfaz1()); /* * Indica que la aplicación termina cuando se cierre la * ventana desde la barra de título. */ ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* * Calcula la apariencia, coordenadas y posición de la * ventana y sus componentes. */ ventana.pack(); // Muestra la ventana. ventana.setVisible(true); } }); }}

En la práctica, las ventanas de aplicación se manejan usando barras de menú.

10

Page 15: Java Grafico

Introducción a Interfaces Gráficas

1.12. Interfaz2.

1.12.1. Ventana.

1.12.2. Código Fuente.1234567891011121314151617181920212223242526272829303132333435

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Interfaz2 extends JFrame implements ActionListener { private final JLabel lblNombre = new JLabel("Nombre:"); private final JTextField txtNombre = new JTextField(10); private final JLabel lblSaludo = new JLabel("Saludo:"); private final JTextField txtSaludo = new JTextField(17); /** * Referencia a un elemento de un menú desplegable cuyo texto es * "Saludo". */ private final JMenuItem itmSaludo = new JMenuItem("Saludo"); { itmSaludo.addActionListener(this); } private final JMenuItem itmSalir = new JMenuItem("Salir"); { itmSalir.addActionListener(this); } /** * Referencia a un menú desplegable cuyo texto es "Archivo". */ private final JMenu menuArchivo = new JMenu("Archivo"); { // Agrega los elementos al menú desplegable. menuArchivo.add(itmSaludo); menuArchivo.add(itmSalir); } /** * Referencia a una barra de menú. */ private final JMenuBar menuBar = new JMenuBar(); {

11

Page 16: Java Grafico

363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889

// Agrega los menús desplegables a la barra de menú. menuBar.add(menuArchivo); } /* * Crea un panel que tendrá 2 renglones X 2 columnas, 10 pixeles de * separación horizontal entre componentes y 12 pixeles de separación * vertical. */ private final JPanel panel = new JPanel(new GridLayout(2, 2, 10, 12)); { /* * Crea un borde sin adornos de 10 pixeles arriba, 11 pixeles a la * izquierda, 12 pixeles abajo y 13 pixeles a la derecha. */ panel.setBorder(BorderFactory.createEmptyBorder(10, 11, 12, 13)); panel.add(lblNombre); panel.add(txtNombre); panel.add(lblSaludo); panel.add(txtSaludo); } public Interfaz2() { // Asigna el título de la ventana. setTitle("Interfaz 2"); // Asigna la barra de menú. setJMenuBar(menuBar); // Asigna el panel a mostrar en la ventana. setContentPane(panel); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); } public void actionPerformed(ActionEvent evt) { // Obtiene la referencia al objeto que origina el evento. Object origen = evt.getSource(); if (origen == itmSaludo) { saludo(); } else if (origen == itmSalir) { System.exit(0); } } private void saludo() { String saludo = "Hola " + txtNombre.getText().trim(); txtSaludo.setText(saludo); } public static void main(String[] args) { /* * Crea un objeto que implementa la interface Runnable. Esta * instancia se pasa como parámetro a invokeLater; este método envía * el objeto al hilo de swing, donde se ejecuta el método run en el * momento que el sistema gráfico determine más adecuado. */ SwingUtilities.invokeLater(new Runnable() { public void run() { // Crea una instancia de Interfaz2 y la muestra. new Interfaz2().setVisible(true);

12

Page 17: Java Grafico

Introducción a Interfaces Gráficas

90919293

} }); }}

13

Page 18: Java Grafico

2. Componenentes Básicos.

2.1. Cuadros de Texto Con Formato (Enteros).

2.1.1. Ventana.

2.1.2. Código Fuente.123456789101112131415

import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.SwingUtilities;public class Números extends JFrame implements ActionListener {

14

Page 19: Java Grafico

Introducción a Interfaces Gráficas

161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

private final JLabel lblNúmero = new JLabel("Número:"); private final JTextField txtNúmero = new JTextField(10); { // Como es número se justifica a la derecha txtNúmero.setHorizontalAlignment(JTextField.TRAILING); } private final JLabel lblResultado = new JLabel("Resultado:"); private final JTextField txtResultado = new JTextField(10); { // txtResultado no se puede editar txtResultado.setEditable(false); } private final JMenuItem itmConvertir = new JMenuItem("Convertir"); { itmConvertir.addActionListener(this); } private final JMenuItem itmSalir = new JMenuItem("Salir"); { itmSalir.addActionListener(this); } private final JMenu menuArchivo = new JMenu("Archivo"); { menuArchivo.add(itmConvertir); menuArchivo.add(itmSalir); } private final JMenuBar menuBar = new JMenuBar(); { menuBar.add(menuArchivo); } private final JPanel panel = new JPanel(new GridLayout(2, 2, 12, 12)); { panel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); panel.add(lblNúmero); panel.add(txtNúmero); panel.add(lblResultado); panel.add(txtResultado); } public Números() { setTitle("Ejemplo con Números"); setJMenuBar(menuBar); setContentPane(panel); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); // Centra la ventana setLocationRelativeTo(null); } public void actionPerformed(ActionEvent evt) { Object origen = evt.getSource(); if (origen == itmConvertir) { convierte(); } else if (origen == itmSalir) { System.exit(0); } }

15

Page 20: Java Grafico

707172737475767778798081828384858687888990919293949596979899

100

private void convierte() { try { int a = Integer.parseInt(txtNúmero.getText()); String resultado = "Ese no lo Conozco"; switch (a) { case 0 : resultado = "Cero"; break; case 1 : resultado = "Uno"; break; case 10 : resultado = "diez"; break; } txtResultado.setText(resultado); } catch (NumberFormatException e) { // Muestra un mensaje de Error: JOptionPane.showMessageDialog(this, "El formato del número es incorrecto.", "Error", JOptionPane.ERROR_MESSAGE); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new Números().setVisible(true); } }); }}

16

Page 21: Java Grafico

Introducción a Interfaces Gráficas

2.2. Texto con Formato (Números en General)

2.2.1. Ventana.

2.2.2. Código Fuente.123456789101112131415161718192021222324252627282930

import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.SwingUtilities;public class Calculadora extends JFrame implements ActionListener { private final JLabel lblA = new JLabel("A:"); private final JTextField txtA = new JTextField(10); { // Como es número se justifica a la derecha txtA.setHorizontalAlignment(JTextField.TRAILING); } private final JLabel lblB = new JLabel("B:"); private final JTextField txtB = new JTextField(10); { // Como es número se justifica a la derecha txtB.setHorizontalAlignment(JTextField.TRAILING); } private final JLabel lblResultado = new JLabel("Resultado:"); private final JTextField txtResultado = new JTextField(10); {

17

Page 22: Java Grafico

313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

// txtResultado no se puede editar txtResultado.setEditable(false); // Como es número se justifica a la derecha txtResultado.setHorizontalAlignment(JTextField.TRAILING); } private final JMenuItem itmSumar = new JMenuItem("Sumar"); { itmSumar.addActionListener(this); } private final JMenuItem itmRestar = new JMenuItem("Restar"); { itmRestar.addActionListener(this); } private final JMenuItem itmSalir = new JMenuItem("Salir"); { itmSalir.addActionListener(this); } private final JMenu menuArchivo = new JMenu("Archivo"); { menuArchivo.add(itmSumar); menuArchivo.add(itmRestar); menuArchivo.add(itmSalir); } private final JMenuBar menuBar = new JMenuBar(); { menuBar.add(menuArchivo); } private final JPanel panel = new JPanel(new GridLayout(3, 2, 12, 12)); { panel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); panel.add(lblA); panel.add(txtA); panel.add(lblB); panel.add(txtB); panel.add(lblResultado); panel.add(txtResultado); } public Calculadora() { setTitle("Calculadora"); setJMenuBar(menuBar); setContentPane(panel); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); // Centra la ventana setLocationRelativeTo(null); } public void actionPerformed(ActionEvent evt) { Object origen = evt.getSource(); if (origen == itmSumar) { suma(); } else if (origen == itmRestar) { resta(); } else if (origen == itmSalir) { System.exit(0);

18

Page 23: Java Grafico

Introducción a Interfaces Gráficas

858687888990919293949596979899

100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136

} } private void suma() { try { double a; try { a = Double.parseDouble(txtA.getText().trim()); } catch (NumberFormatException e) { throw new NumberFormatException("Formato de A Incorrecto"); } double b; try { b = Double.parseDouble(txtB.getText().trim()); } catch (NumberFormatException e) { throw new NumberFormatException("Formato de B Incorrecto"); } txtResultado.setText(String.valueOf(a + b)); } catch (NumberFormatException e) { // Muestra un mensaje de Error: JOptionPane.showMessageDialog(this, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } private void resta() { try { double a; try { a = Double.parseDouble(txtA.getText().trim()); } catch (NumberFormatException e) { throw new NumberFormatException("Formato de A Incorrecto"); } double b; try { b = Double.parseDouble(txtB.getText().trim()); } catch (NumberFormatException e) { throw new NumberFormatException("Formato de B Incorrecto"); } txtResultado.setText(String.valueOf(a - b)); } catch (NumberFormatException e) { // Muestra un mensaje de Error: JOptionPane.showMessageDialog(this, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new Calculadora().setVisible(true); } }); }}

19

Page 24: Java Grafico

2.3. Texto con Formato (Fechas)

2.3.1. Ventana.

2.3.2. Código Fuente.12345678910111213141516171819202122232425262728

import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.DateFormatSymbols;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import javax.swing.BorderFactory;import javax.swing.JFormattedTextField;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.SwingUtilities;public class Fechas extends JFrame implements ActionListener { private final JLabel lblFecha = new JLabel("Fecha de Nacimiento:"); // Crea un formateador de fechas que va a manejael formato: dia - // mes(dos // dígitos) - Año (4 dígitos) private final SimpleDateFormat fmtFecha = new SimpleDateFormat( "dd-MM-yyyy"); // Crea un cuadro de texto formateado que utiliza el formato

20

Page 25: Java Grafico

Introducción a Interfaces Gráficas

293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182

// anterior // para manejar fechas private final JFormattedTextField txtFecha = new JFormattedTextField( fmtFecha); private final JLabel lblDia = new JLabel("Dias:"); private final JTextField txtDia = new JTextField(2); { txtDia.setEditable(false); txtDia.setHorizontalAlignment(JTextField.TRAILING); } private final JLabel lblMes = new JLabel("Mes:"); private final JTextField txtMes = new JTextField(10); { txtMes.setEditable(false); } private final JLabel lblAnio = new JLabel("Año:"); private final JTextField txtAño = new JTextField(4); { txtAño.setEditable(false); txtAño.setHorizontalAlignment(JTextField.TRAILING); } private final JMenuItem itmSeparar = new JMenuItem("Separar"); { itmSeparar.addActionListener(this); } private final JMenuItem itmSalir = new JMenuItem("Salir"); { itmSalir.addActionListener(this); } private final JMenu menuArchivo = new JMenu("Archivo"); { menuArchivo.add(itmSeparar); menuArchivo.add(itmSalir); } private final JMenuBar menuBar = new JMenuBar(); { menuBar.add(menuArchivo); } private final JPanel panel = new JPanel(new GridLayout(4, 2, 12, 12)); { panel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); panel.add(lblFecha); panel.add(txtFecha); panel.add(lblDia); panel.add(txtDia); panel.add(lblMes); panel.add(txtMes); panel.add(lblAnio); panel.add(txtAño); } public Fechas() { setTitle("Fechas"); setJMenuBar(menuBar); setContentPane(panel);

21

Page 26: Java Grafico

8384858687888990919293949596979899

100101102103104105106107108109110111112113114115116117118119120121122123124125126127

setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); // Centra la ventana setLocationRelativeTo(null); } public void actionPerformed(ActionEvent evt) { Object origen = evt.getSource(); if (origen == itmSeparar) { calcula(); } else if (origen == itmSalir) { System.exit(0); } } private void calcula() { try { Date fecha = fmtFecha.parse(txtFecha.getText()); // Crea un objeto de la clase calendario con la fecha de // hoy Calendar calendario = Calendar.getInstance(); // Asigna la fecha al calendario calendario.setTime(fecha); txtDia.setText(String.valueOf(calendario .get(Calendar.DAY_OF_MONTH))); txtAño.setText(String.valueOf(calendario.get(Calendar.YEAR))); int mes = calendario.get(Calendar.MONTH); // Crea una instancia de DateFormatSymbols DateFormatSymbols simbolos = DateFormatSymbols.getInstance(); // Crea un arreglo con los nombres de los meses de acuerdo // a la configuración de idioma del sistema operativo String[] meses = simbolos.getMonths(); // Muestra el nombre del mes mostrado por el calendario txtMes.setText(meses[mes]); } catch (ParseException e) { JOptionPane.showMessageDialog(this, "Formato Incorrecto", "Error", JOptionPane.ERROR_MESSAGE); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new Fechas().setVisible(true); } }); }}

22

Page 27: Java Grafico

Introducción a Interfaces Gráficas

2.4. Cuadros Combinados

2.4.1. Ventana.

2.4.2. Código Fuente.12345678910111213141516171819202122

import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.BorderFactory;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.SwingUtilities;public class CuadrosCombinados extends JFrame implements ActionListener { /** * Arreglo con los valores a mostrar en cmbOrigen. Desde Java 5.0 se * puede omitir la invocación new Double(3.4) y poner 3.4; el compilador * atomáticamente añade la conversión. La información mostrada en el * combo se obtiene al invocar el mátodo toString() en cada elemento del * arreglo. */ private static final Object[] datos = {"Jirafa", "Tigre",

23

Page 28: Java Grafico

232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576

new Double(3.4)}; private final JLabel lblOrigen = new JLabel("Origen"); /** * Crea un cuadro combinado que muestra los datos del arreglo. */ private final JComboBox cmbOrigen = new JComboBox(datos); { // Indica que no hay opción seleccionada. cmbOrigen.setSelectedItem(null); // Notifica cada vez que se selecciona una opción. cmbOrigen.addActionListener(this); } private final JLabel lblDestino = new JLabel("Destino"); /** * Crea un cuadro combinado sin opciones. */ private final JComboBox cmbDestino = new JComboBox(); private final JMenuItem itmLimpiar = new JMenuItem("Limpiar Destino"); { itmLimpiar.addActionListener(this); } private final JMenuItem itmSalir = new JMenuItem("Salir"); { itmSalir.addActionListener(this); } private final JMenu menuArchivo = new JMenu("Archivo"); { menuArchivo.add(itmLimpiar); menuArchivo.add(itmSalir); } private final JMenuBar menuBar = new JMenuBar(); { menuBar.add(menuArchivo); } private final JPanel panel = new JPanel(new GridLayout(2, 2, 12, 12)); { panel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); panel.add(lblOrigen); panel.add(cmbOrigen); panel.add(lblDestino); panel.add(cmbDestino); } public CuadrosCombinados() { setTitle("Cuadros Combinados"); setJMenuBar(menuBar); setContentPane(panel); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } public void actionPerformed(ActionEvent evt) { Object origen = evt.getSource(); if (origen == itmLimpiar) { limpia();

24

Page 29: Java Grafico

Introducción a Interfaces Gráficas

7778798081828384858687888990919293949596979899

100101102103104105

} else if (origen == cmbOrigen) { copia(); } else if (origen == itmSalir) { System.exit(0); } } private void limpia() { // Elimina todas las opciones de cmbDestino. cmbDestino.removeAllItems(); cmbOrigen.setSelectedItem(null); } private void copia() { // Recupera el valor seleccionado en cmbOrigen. Object obj = cmbOrigen.getSelectedItem(); if (obj != null) { // Agrega una opción a cmbDestino. cmbDestino.addItem(obj); // Selecciona el objeto agregado. cmbDestino.setSelectedItem(obj); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new CuadrosCombinados().setVisible(true); } }); }}

2.5. Listas

2.5.1. Ventana.

25

Page 30: Java Grafico

2.5.2. Código Fuente.12345678910111213141516171819202122232425262728293031323334353637383940

import javax.swing.JFrame;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.ListSelectionModel;import javax.swing.SwingUtilities;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;public class Listas extends JFrame implements ListSelectionListener { private static Object[] datos = {"Perro", "Lobo", "Gato", "Delfín", "Ballena", "Perico", "Zopilote", "Gallo", "Ganso", "Cisne"}; private final JList lstAnimales = new JList(datos); { // Solo permite seleccionar un elemento a la vez lstAnimales.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); lstAnimales.addListSelectionListener(this); } private final JScrollPane scrlAnimales = new JScrollPane(lstAnimales); public Listas() { super("Listas"); setContentPane(scrlAnimales); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { return; } Object seleccion = lstAnimales.getSelectedValue(); if (seleccion != null) { JOptionPane.showMessageDialog(this, seleccion.toString()); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new Listas().setVisible(true); }

26

Page 31: Java Grafico

Introducción a Interfaces Gráficas

414243

}); }}

27

Page 32: Java Grafico

3. Tablas.Se utilizan para mostrar información tabular.

3.1. Tablas con Arreglos Bidimensionales.

3.1.1. Ventana.

Las la información contenida por las tablas se almacena en objetos que implementan la interfaz javax.swing.TableModel.

28

Page 33: Java Grafico

Introducción a Interfaces Gráficas

3.1.2. Código Fuente del Modelo.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.table.AbstractTableModel;public class Modelo1 extends AbstractTableModel { private final SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy"); private final Object[][] datos = { {1, "Zoila Vaca", "01-800-MUU", "[email protected]", "Establos #23", fmt.parse("3/10/2003")}, {2, "Rolando Mota", "01-800-VIAJE", "[email protected]", "Misterios #12", fmt.parse("6/11/2005")}, {3, "Armando Pacheco", "01-800-TQUILA", "[email protected]", "Noche de Ronda #99", fmt.parse("23/2/2007")}}; public Modelo1() throws ParseException {} /** * Devuelve el tipo de información de cada columna. De esta forma la * tabla puede desplegar la información con la apariencia adecuada. */ @Override public Class<?> getColumnClass(int columna) { switch (columna) { case 0 : return Integer.class; case 5 : return Date.class; default : return String.class; } } /** * Devuelve el número de columnas. */ public int getColumnCount() { return 6; } /** * Devuelve el encabezado de cada columna. */ @Override public String getColumnName(int columna) { switch (columna) { case 0 : return "Clave"; case 1 : return "Nombre"; case 2 : return "Teléfono"; case 3 : return "Correo Electrónico"; case 4 : return "Dirección"; default : return "Fecha de Inicio"; } } /** * Devuelve el número de columnas. */ public int getRowCount() { return datos.length;

29

Page 34: Java Grafico

53545556575859606162636465666768697071727374757677787980

} /** * Devuelve una referencia al objeto almacenado en una columna. La clase * del objeto debe coincidir con lo devuelto por getColumnClass. */ public Object getValueAt(int renglón, int columna) { return datos[renglón][columna]; } /** * Indica si una celda se puede o no modificar en la tabla. */ @Override public boolean isCellEditable(int renglón, int columna) { switch (columna) { case 0 : return false; default : return true; } } /** * Modifica el valor almacenado en una celda. */ @Override public void setValueAt(Object dato, int renglón, int columna) { datos[renglón][columna] = dato; // Notifica a la tabla que los datos valor cambiaron. fireTableDataChanged(); }}

3.1.3. Código Fuente de la Interfaz.123456789101112131415161718192021

import java.awt.Dimension;import java.awt.print.PrinterException;import java.text.ParseException;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.ListSelectionModel;import javax.swing.SwingUtilities;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;/** * Las tablas utilizan objetos que implementen la interfaz TableModel, los * cuales proporcionan a la tabla la información a desplegar. La clase * AbstractTableModel se puede usar como base. * * La interfaz ListSelectionListener se utiliza para detectar cambios en el * renglón seleccionado de la tabla. */public class Tablas1 extends JFrame implements ListSelectionListener {

30

Page 35: Java Grafico

Introducción a Interfaces Gráficas

222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

/* * Modelo de tabla que contiene los datos a mostrar en la tabla. Define * algunos métodos que proporcionan los datos almacenados y la forma de * desplegarlos. */ private final Modelo1 modelo = new Modelo1(); /** * Datos a mostrar. */ private final JTable tabla = new JTable(); { // Enlaza la tabla con el modelo. tabla.setModel(modelo); // Solo se puede seleccionar un renglón a la vez. tabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // Detecta cuando se selecciona un renglón. tabla.getSelectionModel().addListSelectionListener(this); } // Se tiene que poner en un JScrollPane si quieres ver los encabezados. private final JScrollPane scroll = new JScrollPane(tabla); { // Tamaño del área donde se muestra. scroll.setPreferredSize(new Dimension(500, 100)); } public Tablas1() throws ParseException { setTitle("Tablas1"); setContentPane(scroll); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } @Override public void valueChanged(ListSelectionEvent evt) { // Verifica que la selección se haya detectado correctamente. if (evt.getValueIsAdjusting()) { return; } // Obtiene el renglón seleccionado. Si no hay selección, devuelve -1. int selección = tabla.getSelectedRow(); if (selección != -1) { JOptionPane.showMessageDialog(this, "Seleccionaste el renglón " + selección); } // Si se selecciona el renglón 0, manda una impresión if (selección == 0) { try { tabla.print(); } catch (PrinterException e) { JOptionPane.showMessageDialog(this, e.getMessage(), "Error de Impresión", JOptionPane.ERROR_MESSAGE); } } } public static void main(String[] args) {

31

Page 36: Java Grafico

767778798081828384858687

SwingUtilities.invokeLater(new Runnable() { public void run() { try { Tablas1 frame = new Tablas1(); frame.setVisible(true); } catch (ParseException e) { e.printStackTrace(); } } }); }}

3.2. Tablas con Arreglos de referencias.Este código hace lo mismo que el anterior, pero utiliza objetos para almacenar el contenido de cada renglón.

3.2.1. Código Fuente de “Proveedor.java”.12345678910111213141516171819202122232425262728293031

import java.util.Date;public class Proveedor { private int clave; private String nombre; private String teléfono; private String email; private String dirección; private Date fechaInicial; public Proveedor() {} public Proveedor(int clave, String nombre, String teléfono, String email, String dirección, Date fechaInicial) { this.clave = clave; this.nombre = nombre; this.teléfono = teléfono; this.email = email; this.dirección = dirección; this.fechaInicial = fechaInicial; } public int getClave() { return clave; } public void setClave(int clave) { this.clave = clave; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; }

32

Page 37: Java Grafico

Introducción a Interfaces Gráficas

32333435363738394041424344454647484950515253545556

public String getTeléfono() { return teléfono; } public void setTeléfono(String teléfono) { this.teléfono = teléfono; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getDirección() { return dirección; } public void setDirección(String dirección) { this.dirección = dirección; } public Date getFechaInicial() { return fechaInicial; } public void setFechaInicial(Date fechaInicial) { this.fechaInicial = fechaInicial; }}

3.2.2. Código Fuente del Modelo.12345678910111213141516171819202122232425

import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.table.AbstractTableModel;public class Modelo2 extends AbstractTableModel { private final SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy"); /** * Datos a mostrar. */ private final Conocido[] datos = { new Conocido(1, "Zoila Vaca", "01-800-MUU", "[email protected]", "Establos #23", fmt.parse("3/10/2003")), new Conocido(2, "Rolando Mota", "01-800-VIAJE", "[email protected]", "Misterios #12", fmt.parse("6/11/2005")), new Conocido(3, "Armando Pacheco", "01-800-TQUILA", "[email protected]", "Noche de Ronda #99", fmt.parse("23/2/2007"))}; public Modelo2() throws ParseException {} @Override public Class<?> getColumnClass(int columna) { switch (columna) { case 0 : return Integer.class; case 5 : return Date.class;

33

Page 38: Java Grafico

262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879

default : return String.class; } } public int getColumnCount() { return 6; } @Override public String getColumnName(int columna) { switch (columna) { case 0 : return "Clave"; case 1 : return "Nombre"; case 2 : return "Teléfono"; case 3 : return "Correo Electrónico"; case 4 : return "Dirección"; default : return "Fecha de Inicio"; } } public int getRowCount() { return datos.length; } public Object getValueAt(int renglón, int columna) { switch (columna) { case 0 : return datos[renglón].getClave(); case 1 : return datos[renglón].getNombre(); case 2 : return datos[renglón].getTeléfono(); case 3 : return datos[renglón].getEmail(); case 4 : return datos[renglón].getDirección(); default : return datos[renglón].getFechaInicial(); } } @Override public boolean isCellEditable(int renglón, int columna) { switch (columna) { case 0 : return false; default : return true; } } @Override public void setValueAt(Object dato, int renglón, int columna) { switch (columna) { case 0 : datos[renglón].setClave((Integer) dato); break; case 1 : /* * Cuando los datos son de tipo String es más eficiente * invocar el método toString(). */ datos[renglón].setNombre(dato.toString()); break; case 2 : datos[renglón].setTeléfono(dato.toString()); break; case 3 :

34

Page 39: Java Grafico

Introducción a Interfaces Gráficas

80818283848586878889

datos[renglón].setEmail(dato.toString()); break; case 4 : datos[renglón].setDirección(dato.toString()); default : datos[renglón].setFechaInicial((Date) dato); } fireTableDataChanged(); }}

3.2.3. Código Fuente de la interfaz.12345678910111213141516171819202122232425262728293031323334353637383940

import java.awt.Dimension;import java.awt.print.PrinterException;import java.text.MessageFormat;import java.text.ParseException;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.ListSelectionModel;import javax.swing.SwingUtilities;import javax.swing.JTable.PrintMode;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;/** * Esta versión maneja arreglos de objetos pertenecientes a la clase * Proveedor. */public class Tablas2 extends JFrame implements ListSelectionListener { private final Modelo2 modelo = new Modelo2(); private final JTable tabla = new JTable(); { tabla.setModel(modelo); tabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tabla.getSelectionModel().addListSelectionListener(this); } private final JScrollPane scroll = new JScrollPane(tabla); { scroll.setPreferredSize(new Dimension(500, 100)); } public Tablas2() throws ParseException { setTitle("Tablas2"); setContentPane(scroll); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } @Override public void valueChanged(ListSelectionEvent evt) { if (evt.getValueIsAdjusting()) {

35

Page 40: Java Grafico

41424344454647484950515253545556575859606162636465666768697071727374757677

return; } int selección = tabla.getSelectedRow(); if (selección != -1) { JOptionPane.showMessageDialog(this, "Seleccionaste el renglón " + selección); } // Si se selecciona el renglón 0, manda una impresión. if (selección == 0) { // Define el encabezado de la impresión. MessageFormat encabezado = new MessageFormat("Ejemplo"); /* * Define el pie de página. {0} muestra el número de página y * también se puede poner en el encabezado. */ MessageFormat pie = new MessageFormat("Página {0}"); try { tabla.print(PrintMode.NORMAL, encabezado, pie); } catch (PrinterException e) { JOptionPane.showMessageDialog(this, e.getMessage(), "Error de Impresión", JOptionPane.ERROR_MESSAGE); } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { try { Tablas2 frame = new Tablas2(); frame.setVisible(true); } catch (ParseException e) { e.printStackTrace(); } } }); }}

36

Page 41: Java Grafico

Introducción a Interfaces Gráficas

4. Cuadros de Diálogo.Nos permiten implementar ventanas secundarias.

4.1. Cuadros de Diálogo Predefinidos.

4.1.1. Ventana.

37

Page 42: Java Grafico

4.1.2. Código Fuente.12345678910111213141516171819202122232425262728293031323334353637383940

import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.SwingUtilities;public class DiálogosPredefinidos extends JFrame implements ActionListener { private final JLabel lblTexto = new JLabel("Texto:"); private final JTextField txtTexto = new JTextField(10); private final JMenuItem itmConfirmar = new JMenuItem("Confirmar"); { itmConfirmar.addActionListener(this); } private final JMenuItem itmLeer = new JMenuItem("Leer"); { itmLeer.addActionListener(this); } private final JMenuItem itmMensaje = new JMenuItem("Mensaje"); { itmMensaje.addActionListener(this); } private final JMenuItem itmError = new JMenuItem("Error"); { itmError.addActionListener(this); } private final JMenuItem itmSalir = new JMenuItem("Salir"); { itmSalir.addActionListener(this); } private final JMenu menuArchivo = new JMenu("Archivo"); { menuArchivo.add(itmConfirmar);

38

Page 43: Java Grafico

Introducción a Interfaces Gráficas

414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394

menuArchivo.add(itmLeer); menuArchivo.add(itmMensaje); menuArchivo.add(itmError); menuArchivo.add(itmSalir); } private final JMenuBar menuBar = new JMenuBar(); { menuBar.add(menuArchivo); } private final JPanel panel = new JPanel(new GridLayout(1, 2, 12, 12)); { panel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); panel.add(lblTexto); panel.add(txtTexto); } public DiálogosPredefinidos() { setTitle("Dialogos Predefinidos"); setJMenuBar(menuBar); setContentPane(panel); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } public void actionPerformed(ActionEvent evt) { Object origen = evt.getSource(); if (origen == itmConfirmar) { confirma(); } else if (origen == itmLeer) { lee(); } else if (origen == itmMensaje) { mensaje(); } else if (origen == itmError) { error(); } else if (origen == itmSalir) { System.exit(0); } } private void confirma() { /* * Muestra un diálogo de confirmación con las opciones Yes, No y * Cancel, con el mensaje indicado y el título "Seleccionar una * Opción". */ int respuesta = JOptionPane.showConfirmDialog(this, "¿Te gusta Java?"); if (respuesta == JOptionPane.YES_OPTION) { txtTexto.setText("SI"); } else if (respuesta == JOptionPane.NO_OPTION) { txtTexto.setText("NO"); } else if (respuesta == JOptionPane.CANCEL_OPTION) { txtTexto.setText("CANCELADO"); } else if (respuesta == JOptionPane.CLOSED_OPTION) { txtTexto.setText("SE CERRÓ"); }

39

Page 44: Java Grafico

9596979899

100101102103104105106107108109110111112113114115116117

} private void lee() { // Muestra un diálogo que solicita un valor. String respuesta = JOptionPane.showInputDialog(this, "Teclea Algo"); txtTexto.setText(respuesta); } private void mensaje() { // Abre un diálogo que muestra un mensaje informativo. JOptionPane.showMessageDialog(this, txtTexto.getText()); } private void error() { // Abre un diálogo que muestra un mensaje de error. JOptionPane.showMessageDialog(this, txtTexto.getText(), "Error", JOptionPane.ERROR_MESSAGE); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new DiálogosPredefinidos().setVisible(true); } }); }}

4.2. Cuadros de Selección de Color.

4.2.1. Ventana.

40

Page 45: Java Grafico

Introducción a Interfaces Gráficas

4.2.2. Código Fuente.12345678910111213141516171819202122232425262728

import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JColorChooser;import javax.swing.JFrame;import javax.swing.SwingUtilities;public class ColorChoosers extends JFrame implements ActionListener { private final JButton botón = new JButton("Seleccionar Color"); { botón.addActionListener(this); } public ColorChoosers() { super("ColorChoosers"); setContentPane(botón); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } public void actionPerformed(ActionEvent evt) { /* * Muestra un cuadro de diálogo que permite seleccionar el color, * cuyo padre es este JFrame, su título es "Selecciona el color del * botón" y toma como valor inicial el color actual del botón. */ Color c = JColorChooser.showDialog(this, "Selecciona el color del botón", botón.getBackground());

41

Page 46: Java Grafico

29303132333435363738394041424344

/* * Define el color de fonde del botón. Esta instrucción funciona para * cualquier componente gráfico. Para cambia el color de letra se * usaría botón.setForeground(c); */ botón.setBackground(c); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { ColorChoosers frame = new ColorChoosers(); frame.setVisible(true); } }); }}

4.3. Areas de Texto y Diálogos de Impresión.

4.3.1. Ventana.

42

Page 47: Java Grafico

Introducción a Interfaces Gráficas

4.3.2. Código Fuente.1234567891011121314151617181920212223242526272829303132

import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.print.PrinterException;import java.text.MessageFormat;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.SwingUtilities;public class AreasDeTexto extends JFrame implements ActionListener { // Área de texto que muestra 5 renglones y 10 columnas. private final JTextArea texto = new JTextArea(5, 10); { // Asigna contentido al área de texto. texto.setText("Hola\n"); // \n es un salto de línea. // Agrega contentido al final del área de texto. texto.append("Amigos\n"); } private final JScrollPane scroll = new JScrollPane(texto); private final JMenuItem itmContar = new JMenuItem("Contar Caracteres"); { itmContar.addActionListener(this); } private final JMenuItem itmImprimir = new JMenuItem("Imprimir"); { itmImprimir.addActionListener(this); } private final JMenuItem itmSalir = new JMenuItem("Salir");

43

Page 48: Java Grafico

333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586

{ itmSalir.addActionListener(this); } private final JMenu menuArchivo = new JMenu("Archivo"); { menuArchivo.add(itmContar); menuArchivo.add(itmImprimir); menuArchivo.add(itmSalir); } private final JMenuBar menuBar = new JMenuBar(); { menuBar.add(menuArchivo); } public AreasDeTexto() { super("Areas de Texto"); setJMenuBar(menuBar); setContentPane(scroll); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } public void actionPerformed(ActionEvent evt) { Object origen = evt.getSource(); if (origen == itmContar) { contar(); } else if (origen == itmImprimir) { imprimir(); } else if (origen == itmSalir) { System.exit(0); } } private void contar() { String contenido = texto.getText(); JOptionPane.showMessageDialog(this, contenido.length() + " caracteres"); } private void imprimir() { // Define el encabezado de la impresión MessageFormat encabezado = new MessageFormat("Ejemplo"); /* * Define el pie de página. {0} muestra el número de página y también * se puede poner en el encabezado. */ MessageFormat pie = new MessageFormat("Página {0}"); try { texto.print(encabezado, pie); } catch (PrinterException e) { JOptionPane.showMessageDialog(this, e.getMessage(), "Error de Impresión", JOptionPane.ERROR_MESSAGE); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() {

44

Page 49: Java Grafico

Introducción a Interfaces Gráficas

8788899091

new AreasDeTexto().setVisible(true); } }); }}

45

Page 50: Java Grafico

5. Layouts.Los layouts nos permiten controlar la forma en que los componentes gráficos se despliegan.

5.1. FlowLayout.Este layout permite colocar los componentes horizontalmente para idiomas occidentales.

Hay diferentes constructores.

public FlowLayout() Descripción:Justifica los componentes a la izquierda, dejando 5 pixeles de separación vertical y horizontal entre sus componentes.

public FlowLayout(int alineación)Descripción:Permite indicar la alineación de los componentes, dejando 5 pixeles de separación vertical y horizontal entre sus componentes. Los valores para la alineación son:

FlowLayout.LEADING - Alineación al inicio del componente.

FlowLayout.CENTER - Centrado.

FlowLayout.TRAILING - Alineación al final del componente.

public FlowLayout(int alineación, int separaciónHorizontal, int separaciónVertical)

46

Page 51: Java Grafico

Introducción a Interfaces Gráficas

Este es el layout predeterminado para JPanel; es decir que la instrucciónnew JPanel()crea un panel que emplea como layout el resultado de la expresiónnew FlowLayout()

5.1.1. Ventana.

5.1.2. Código Fuente.

1234567891011121314151617181920212223242526272829

import java.awt.FlowLayout;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.SwingUtilities;public class FlowLayouts extends JPanel { public FlowLayouts() { /* * Crea un panel indicando explícitamente el uso de FlowLayout. Como * es el layout por predeterminado, se puede simplemente omitir la * invocación a super. */ super(new FlowLayout()); add(new JButton("Hola")); add(new JButton("Mundo")); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("FlowLayout"); frame.setContentPane(new FlowLayouts()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } }); }}

47

Page 52: Java Grafico

5.2. BorderLayout. El BorderLayout maneja las siguientes posiciones en occidente.

PAGE_START

LINE_START CENTER LINE_END

PAGE_END

Al aumentar el tamaño de la ventana, el centro crece en altura y anchura, mientras que las posiciones LINE_START y LINE_END crecen en altura. Estas posiciones se adecuan a las convenciones utilizadas por otros idiomas.

Están los siguientes constructores:

public BorderLayout() Descripción:Crea una distribución de borde que no deja separación entre los componentes.

public BorderLayout(int separacionHorizontal, int separacionVertical)

5.2.1. Ventana.

5.2.2. Código Fuente.1234567891011

import java.awt.BorderLayout;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.SwingUtilities;public class BorderLayouts extends JPanel { public BorderLayouts() { // Crea un panel que usa BorderLayout. super(new BorderLayout()); add(new JButton("PAGE_START"), BorderLayout.PAGE_START);

48

Page 53: Java Grafico

Introducción a Interfaces Gráficas

121314151617181920212223242526272829

add(new JButton("LINE_START"), BorderLayout.LINE_START); add(new JButton("CENTER"), BorderLayout.CENTER); add(new JButton("LINE_END"), BorderLayout.LINE_END); add(new JButton("PAGE_END"), BorderLayout.PAGE_END); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("BorderLayout"); frame.setContentPane(new BorderLayouts()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); }}

5.3. GridBagLayout.Permite dar un formato versatil a las ventanas. A cada componente le asocia una instancia de la clase GridBagConstraints que describe como colocar el componente en el panel y tiene los siguientes campos:

gridx Número de columna donde está colocado el componente, siendo gridx = 0 la posición más a la izquierda.

gridy Número renglón donde está colocado el componente, siendo gridy = 0 el renglón superior.

gridwidth Número de columnas del componente. Si no se especifica, el valor es 1.

gridheight Número de renglones del componente. Si no se especifica, el valor es 1.

fill Se usa cuando el área donde se desplegará el componte es más grande que el tamaño preferido del mismo. Determina como recacular su tamaño. Los valores posibles son:

● GridBagConstraints.NONE (default) - no lo cambia

● GridBagConstraints.HORIZONTAL - Hace que el componente llene toda el área horizontal, pero no cambia su altura.

● GridBagConstraints.VERTICAL - Hace que el componente llene toda el área vertical, pero no cambia su ancho.

● GridBagConstraints.BOTH - Ocupa toda el área.

ipadx Indican el relleno horizontal que se agrega dentro de la celda del componente.

ipady Indican el relleno vertical que se agrega dentro de la celda del componente.

49

Page 54: Java Grafico

insets Borde alrededor del componente. Se utiliza un componente de la clase java.awt.Insets, euq tiene los siguientes campos:

left – Número de pixeles en el borde izquierdo.

top – Número de pixeles en el borde superior.

right – Número de pixeles en el borde derecho.

bottom – Número de pixeles en el borde inferior.

anchor Alinea el componente cuando el área donde se desplegará es más grande que su tamaño y el valor de fill no es BOTH. Los valores posibles se esquematizan a continuación:

FIRST_LINE_START PAGE_START FIRST_LINE_END

LINE_START CENTER LINE_END

LAST_LINE_START PAGE_END LAST_LINE_END

El valor predeterminado es CENTER.

weightx Crecimiento horizontal. Determina como distribuir espacio cuando la ventana crece a lo ancho. Si este valor es cero para todos los componentes, estos se centran dentro de la ventana. Si es mayor a cero para algunos componentes, el espacio horizontal que falta por asignar se reparte de forma ponderada. Es decir, el valor más grande toma más espacio.

weighty Crecimiento vertical. Determina como distribuir espacio cuando la ventana crece a lo alto. Si este valor es cero para todos los componentes, estos se centran dentro de la ventana. Si es mayor a cero para algunos componentes, el espacio vertical que falta por asignar se reparte de forma ponderada. Es decir, el valor más grande toma más espacio.

Hay otras formas de usar la clase GridBagConstraints, pero esta es la más directa.

50

Page 55: Java Grafico

Introducción a Interfaces Gráficas

5.3.1. Ventana.

5.3.2. Código Fuente.123456789101112131415161718192021222324252627282930313233343536

import java.awt.Component;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.SwingUtilities;/** * Este ejemplo crea la siguente distribución: * 0 1 2 - x * +---+---+---+ * 0 | | 1 | | * +---+---+---+ * 1 | 2 | 3 | 4 | * +---+---+---+ * 2 | 5 | | * +---+ 6 | * 3 | 7 | | * +---+-------+ * 4 | 8 | * | +-----------+ * y */public class GridBagLayouts extends JPanel { private final GridBagConstraints g = new GridBagConstraints(); { g.fill = GridBagConstraints.BOTH; } public GridBagLayouts() { super(new GridBagLayout()); add(0, 1, 1, 1, new JButton("1")); add(1, 0, 1, 1, new JButton("2")); add(1, 1, 1, 1, new JButton("3")); add(1, 2, 1, 1, new JButton("4")); add(2, 0, 1, 1, new JButton("5"));

51

Page 56: Java Grafico

373839404142434445464748495051525354555657585960

add(2, 1, 2, 2, new JButton("6")); add(3, 0, 1, 1, new JButton("7")); add(4, 0, 1, 3, new JButton("8")); } private void add(int y, int x, int alto, int ancho, Component c) { g.gridy = y; g.gridx = x; g.gridheight = alto; g.gridwidth = ancho; add(c, g); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("GridBagLayout"); frame.setContentPane(new GridBagLayouts()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); frame.setLocationRelativeTo(null); } }); }}

5.4. Clase de Ayuda para GridBagLayout.En este ejemplo, el área de texto crece a lo largo y a lo ancho.

5.4.1. Ventana.

52

Page 57: Java Grafico

Introducción a Interfaces Gráficas

5.4.2. Código Fuente de “GBC.java”.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

import java.awt.GridBagConstraints;/** * Esta clase está hecha para simplificar el uso de GridBag Constraints. */public class GBC extends GridBagConstraints { /** * Crea un objeto de GBC alineado a la esquina superior izquierda de la * celda. */ public GBC() { anchor = FIRST_LINE_START; } /** * Crea un objeto de GBC de una celda de alto y ancho. El componente que * contiene está alineado a la esquina superior izquierda de la celda. * * @param y * Renglón de la celda. * @param x * Columna de la celda. */ public GBC(int y, int x) { gridy = y; gridx = x; anchor = FIRST_LINE_START; } /** * Crea una instancia de GBC. El componente que contiene está alineado a * la esquina superior izquierda de la celda. * * @param y * Renglón de la celda. * @param x * Columna de la celda. * @param alto * Número de renglones que abarca el componente. * @param ancho * Número de columnas que abarca el componente. */ public GBC(int y, int x, int alto, int ancho) { gridy = y; gridx = x; gridheight = alto; gridwidth = ancho; anchor = FIRST_LINE_START; } /** * Asigna la alineación del componente * * @param anchor * Alineación del componente.

53

Page 58: Java Grafico

5354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899

100101102103104105106

* * @return El mismo objeto de GBC que recibió el mensaje. */ public GBC anchor(int anchor) { this.anchor = anchor; return this; } /** * Asigna la forma de llenar la celda cuando el componente que contiene * es más pequeño que esta: * * @param fill * Forma de llenar la celda. * * @return El mismo objeto de GBC que recibió el mensaje. */ public GBC fill(int fill) { this.fill = fill; return this; } /** * Asigna el ancho del borde de la celda. * * @param arriba * Número de pixeles del borde superior. * @param izquierda * Número de pixeles del borde izquierdo. * @param abajo * Número de pixeles del borde inferior. * @param derecha * Número de pixeles del borde derecho. * @return El mismo objeto de GBC que recibió el mensaje. */ public GBC insets(int arriba, int izquierda, int abajo, int derecha) { insets.top = arriba; insets.left = izquierda; insets.bottom = abajo; insets.right = derecha; return this; } /** * Asigna la forma de crecer de la celda. * * @param x * Forma de crecer horizontalmente. * @param y * Forma de crecer verticalmente. * @return El mismo objeto de GBC que recibió el mensaje. */ public GBC weight(double x, double y) { weightx = x; weighty = y; return this; }

54

Page 59: Java Grafico

Introducción a Interfaces Gráficas

107 }

5.4.3. Código Fuente de “GridBagLayout2.java”.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849

import java.awt.GridBagLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFormattedTextField;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.SwingUtilities;/** * Este ejemplo crea la siguente distribución: * (La letra B significa borde de separación) * (La letra C indica que el componente crece) * 0 1 - x * +-----------------------+----------------+ * |BBBBBBBBBBBBBBBBBBBBBBB|BBBBBBBBBBBBBBB | * 0 |B Clave: B| |__________| B | * |BBBBBBBBBBBBBBBBBBBBBBB|BBBBBBBBBBBBBBB | * +-----------------------+----------------+ * 1 |B Nombre: B| |____CX____| B | * |BBBBBBBBBBBBBBBBBBBBBBB|BBBBBBBBBBBBBBB | * +-----------------------+----------------+ * 2 |B Teléfono: B| |__________| B | * |BBBBBBBBBBBBBBBBBBBBBBB|BBBBBBBBBBBBBBB | * +-----------------------+----------------+ * 3 |B Correo Electrónico: B| |__________| B | * |BBBBBBBBBBBBBBBBBBBBBBB|BBBBBBBBBBBBBBB | * +-----------------------+----------------+ * 4 |B Fecha Inicial: B| |__________| B | * |BBBBBBBBBBBBBBBBBBBBBBB|BBBBBBBBBBBBBBB | * +-----------------------+----------------+ * 5 |B Dirección: B| |___CXY____| B | * |BBBBBBBBBBBBBBBBBBBBBBB|BBBBBBBBBBBBBBB | * | +-----------------------+----------------+ * y */public class GridBagLayout2 extends JFrame implements ActionListener { private final JLabel lblClave = new JLabel("Clave:"); private final JTextField txtClave = new JFormattedTextField(11); { txtClave.setHorizontalAlignment(JTextField.TRAILING); } private final JLabel lblNombre = new JLabel("Nombre:"); private final JTextField txtNombre = new JTextField(50); private final JLabel lblTeléfono = new JLabel("Teléfono:");

55

Page 60: Java Grafico

5051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596

private final JTextField txtTeléfono = new JTextField(50); private final JLabel lblEmail = new JLabel("Correo Electrónico:"); private final JTextField txtEmail = new JTextField(50); private final JLabel lblFecha = new JLabel("Fecha Inicial:"); private final JTextField txtFecha = new JTextField(10); private final JLabel lblDirección = new JLabel("Dirección:"); private final JTextArea txtDirección = new JTextArea(3, 50); private final JMenuItem itmSalir = new JMenuItem("Salir"); { itmSalir.addActionListener(this); } private final JPanel panel = new JPanel(new GridBagLayout()); { panel.add(lblClave, new GBC(0, 0).insets(12, 12, 12, 12)); panel.add(txtClave, new GBC(0, 1).insets(12, 0, 12, 12)); panel.add(lblNombre, new GBC(1, 0).insets(0, 12, 12, 12)); panel.add(txtNombre, new GBC(1, 1).insets(0, 0, 12, 12) .weight(1.0, 0.0).fill(GBC.HORIZONTAL)); panel.add(lblTeléfono, new GBC(2, 0).insets(0, 12, 12, 12)); panel.add(txtTeléfono, new GBC(2, 1).insets(0, 0, 12, 12) .weight(1.0, 0.0)); panel.add(lblEmail, new GBC(3, 0).insets(0, 12, 12, 12)); panel.add(txtEmail, new GBC(3, 1).insets(0, 0, 12, 12) .weight(1.0, 0.0)); panel.add(lblFecha, new GBC(4, 0).insets(0, 12, 12, 12)); panel.add(txtFecha, new GBC(4, 1).insets(0, 0, 12, 12)); panel.add(lblDirección, new GBC(5, 0).insets(0, 12, 12, 12)); panel.add(new JScrollPane(txtDirección), new GBC(5, 1) .insets(0, 0, 12, 12).fill(GBC.BOTH).weight(1.0, 1.0)); } public GridBagLayout2() { setTitle("Ejemplo mejorado de GridBagLayout"); setContentPane(new JScrollPane(panel)); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); } public void actionPerformed(ActionEvent evt) { System.exit(0); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new GridBagLayout2().setVisible(true); } }); }}

56