159
ALGORITMICA Y PROGRAMACION POR OBJETOS I Nivel 5 Construyendo la Interfaz Gráfica Marcela Hernández Hoyos

interfaz grafica

Embed Size (px)

DESCRIPTION

interfaz grafica

Citation preview

Page 1: interfaz grafica

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Nivel 5

Construyendo la Interfaz Gráfica

Marcela Hernández Hoyos

Page 2: interfaz grafica

Motivación

Único medio de comunicación entre el usuario y el modelo del mundo

Modelo del mundo

Usuario

Interfaz usuario

Page 3: interfaz grafica

Motivación

Interfaz usuario

Modelo del mundo

Usuario

A través de la interfaz: • Ejecuta

operaciones sobre el modelo del mundo.

• Ve el resultado de sus acciones.

Page 4: interfaz grafica

Aspectos importantes

ArquitecturaDiseño funcional y gráfico

• Estructura clara• Fácil de mantener

• Colores• Distribución de

elementos gráficos (menús, botones, …)

Page 5: interfaz grafica

Qué vamos a aprender en este nivel:

Cómo proponer una arquitectura para un programa simple:– Repartir responsabilidades entre interfaz, mundo y

pruebas.

Cómo construir las clases que implementan una interfaz usuario

Cómo integrar las clases de la interfaz con las clases del mundo

Page 6: interfaz grafica

Caso de estudio: Calculador de Impuestos

Page 7: interfaz grafica

El Calculador de Impuestos

• Funcionalidad• Interfaz usuario• Requerimientos Funcionales• Arquitectura

– Mundo– Interfaz

Page 8: interfaz grafica

El Calculador de Impuestos -Funcionalidad

• Calcula el valor de los impuestos que una persona debe pagar por su carro

• Vehículo se caracteriza por:– Marca, línea, modelo y precio

• Cálculo de impuestos como porcentaje del precio del vehículo (% determinado por un rango)

• Hay tres tipos de descuento– Pronto pago, servicio público, traslado de cuenta

Page 9: interfaz grafica

El Calculador de Impuestos –Interfaz usuario

Ventana Principal

3 Zonas de trabajo:

Información del vehículo

Descuentos

Cálculo de impuestos + inicializar la aplicación

Page 10: interfaz grafica

El Calculador de Impuestos –Requerimientos Funcionales

R1 Buscar el avalúo de un vehículoR2 Calcular el pago de impuesto de un vehículoRNF Requerimiento NO FUNCIONAL (inicializar la aplicación

sin tener que volver a ejecutarla)

Page 11: interfaz grafica

Tarea No. 1

• RF1: Buscar el avalúo de un vehículo– Resumen:

• Dada la información del vehículo, presentar el valor de avalúo del mismo

– Entradas:

– Resultado:

Page 12: interfaz grafica

Tarea No. 1

• RF2:Calcular el pago de impuesto de un vehículo– Resumen:

• Dada la información de un vehículo, y el conjunto de descuentos que le aplican, dar el valor a pagar por los impuestos del vehículo

– Entradas:

– Resultado:

Page 13: interfaz grafica

El Calculador de Impuestos –Arquitectura

Mundo Interfaz

Page 14: interfaz grafica

El Calculador de Impuestos (Mundo)

0 .. nrangos

0 .. nmodelos

0 .. nlineas

0 .. n marcas

Page 15: interfaz grafica
Page 16: interfaz grafica

Tarea No. 2• CalculadorImpuestos

– Constantes– Asociaciones

• Marca– Atributos– Asociaciones

• Linea– Atributos– Asociaciones

• Modelo– Atributos

• RangoImpuesto– Atributos

Page 17: interfaz grafica

Métodos de la clase CalculadorImpuestos (pag. 3)

buscarAvaluoVehiculo

/*** Retorna el valor de avalúo de un vehiculo de la marca, línea y modelo dado.* @param unaMarca - marca del vehiculo* @param unaLinea - linea del vehiculo* @param unModelo - modelo del vehiculo* @return precio de avalúo del vehiculo* @throws Exception si no encuentra la marca o la linea o el modelo registrados*/

public double buscarAvaluoVehiculo( String unaMarca, String unaLinea, String unModelo ) throws Exception

Page 18: interfaz grafica

Métodos de la clase CalculadorImpuestos (pag. 3)

calcularPago

/*** Calcular el pago de impuesto que debe hacer un vehículo de un modelo dado. Si no

encuentra un rango para el modelo devuelve 0* @param unaMarca - marca del vehiculo* @param unaLinea - linea del vehiculo* @param unModelo - modelo del vehiculo* @param descProntoPago - indica si aplica el descuento por pronto pago* @param descServicioPublico - indica si aplica el descuento por servicio público* @param descTrasladoCuenta - indica si aplica el descuento por traslado de cuenta* @return valor a pagar* @throws Exception si no encuentra el vehiculo dado por la marca, la linea y el modelo*/

public double calcularPago( String unaMarca, String unaLinea, String unModelo, boolean descProntoPago, boolean descServicioPublico, boolean descTrasladoCuenta) throws Exception

Page 19: interfaz grafica

Construcción de interfaces gráficas

Page 20: interfaz grafica

El Calculador de Impuestos –Interfaz usuario

Ventana Principal

3 Zonas de trabajo:

Información del vehículo

Descuentos

Cálculo de impuestos + inicializar la aplicación

Page 21: interfaz grafica

El Calculador de Impuestos –Interfaz usuario

InterfazImpuestosCarro (JFrame)

3 Zonas de trabajo:

PanelVehiculo (JPanel)

PanelDescuentos (JPanel)

PanelResultados (JPanel)

Page 22: interfaz grafica

El Calculador de Impuestos –Interfaz usuario

InterfazImpuestosCarro(JFrame)

Clases JAVA

PanelVehiculo (JPanel)

PanelDescuentos (JPanel)

PanelResultados (JPanel)

Page 23: interfaz grafica

Entidades

Mundo del Problema Mundo Gráfico y de Interacción

• Ventana (JFrame)• Panel (JPanel)• Botón (JButton)

• Estudiante• Tienda• Banco

• Zona de texto (JTextField)• Etiqueta (JLabel)• Caja de chequeo (JCheckBox)

• Recurso• Avion• …

Page 24: interfaz grafica

Entidades del mundo gráfico y de interacción

Ventana

Page 25: interfaz grafica

Entidades del mundo gráfico y de interacción

Panel

Page 26: interfaz grafica

Entidades del mundo gráfico y de interacción

Zona de texto

Page 27: interfaz grafica

Entidades del mundo gráfico y de interacción

Caja de chequeo

Page 28: interfaz grafica

Entidades del mundo gráfico y de interacción

Etiqueta

Page 29: interfaz grafica

Entidades del mundo gráfico y de interacción

Boton

Page 30: interfaz grafica

El Calculador de Impuestos (Interfaz)

principal

principal

Page 31: interfaz grafica

El Calculador de Impuestos –Interfaz usuario

InterfazImpuestosCarro (JFrame)

3 Zonas de trabajo:

PanelVehiculo (JPanel)

PanelDescuentos (JPanel)

PanelResultados (JPanel)

Page 32: interfaz grafica

El Calculador de Impuestos –Interfaz usuario

InterfazImpuestosCarro(JFrame)

Clases JAVA

PanelVehiculo (JPanel)

PanelDescuentos (JPanel)

PanelResultados (JPanel)

Page 33: interfaz grafica

El Calculador de Impuestos –Interfaz usuario

InterfazImpuestosCarro(JFrame)

PanelVehiculo (JPanel)

PanelDescuentos (JPanel)

PanelResultados (JPanel)

•Se encuentran en una biblioteca gráfica (swing)•Paquete: java.swing•Deber ser importado

Page 34: interfaz grafica

Elementos gráficos estructurales

Page 35: interfaz grafica

La Ventana Principal

Page 36: interfaz grafica

La Ventana Principal

• Contiene TODOS los elementos de visualización e interacción (con los que el usuario va a utilizar el programa)

• UNICA FUNCION:– Servir como marco para los demás elementos

de la interfaz (AGRUPA)

• Es un contenedor gráfico

Page 37: interfaz grafica

La Ventana PrincipalTítulo

Controles para cerrar el

programa

Page 38: interfaz grafica

La Ventana Principal

Ventana principal = Objeto de la clase

InterfazImpuestosCarro

principal

principal

Page 39: interfaz grafica

Clase InterfazImpuestosCarro

• Como cualquier clase:– Está declarada en su propio archivo:

InterfazImpuestosCarro.java (pag. 8)– Sigue las mismas reglas que cualquier clase

del mundo• Diferencia:

– Está declarada en otro paquete: uniandes.cupi2.impuestosCarro.interfaz (ver en Eclipse)

Page 40: interfaz grafica

Clase InterfazImpuestosCarro

package uniandes.cupi2.impuestosCarro.interfaz;import java.awt.*;import javax.swing.*;import uniandes.cupi2.impuestosCarro.mundo.*;/*** Interfaz de cálculo de impuestos de carros*/public class InterfazImpuestosCarro extends

JFrame{}

Page 41: interfaz grafica

Clase InterfazImpuestosCarro

package uniandes.cupi2.impuestosCarro.interfaz;

La clase se declara dentro del paquete de las clases de la interfaz usuario

Page 42: interfaz grafica

Clase InterfazImpuestosCarro

package uniandes.cupi2.impuestosCarro.interfaz;import java.awt.*;import javax.swing.*;

Se importan las clases de los dos paquetes mostrados (swing y awt)

Page 43: interfaz grafica

Clase InterfazImpuestosCarro

package uniandes.cupi2.impuestosCarro.interfaz;import java.awt.*;import javax.swing.*;import uniandes.cupi2.impuestosCarro.mundo.*;

Se importan las clases del modelo del mundo

Page 44: interfaz grafica

Clase InterfazImpuestosCarro

principal

principal

Page 45: interfaz grafica

Clase InterfazImpuestosCarro

package uniandes.cupi2.impuestosCarro.interfaz;import java.awt.*;import javax.swing.*;import uniandes.cupi2.impuestosCarro.mundo.*;/*** Interfaz de cálculo de impuestos de carros*/public class InterfazImpuestosCarro extends

JFrame{}

La clase se declara con la misma sintáxis de las clases del modelo del mundo

Page 46: interfaz grafica

Clase InterfazImpuestosCarro

package uniandes.cupi2.impuestosCarro.interfaz;import java.awt.*;import javax.swing.*;import uniandes.cupi2.impuestosCarro.mundo.*;/*** Interfaz de cálculo de impuestos de carros*/public class InterfazImpuestosCarro extends

JFrame{}

Se agrega extends JFrame para indicar que es una ventana

Page 47: interfaz grafica

Clase InterfazImpuestosCarroClase de swing

que se estáextendiendo

principal

principal

Page 48: interfaz grafica

Clase InterfazImpuestosCarro

Cómo cambiar el estado (apariencia) de la ventana?

Page 49: interfaz grafica

Clase InterfazImpuestosCarro

Cómo cambiar el estado (apariencia) de la ventana?

R// Con los métodos de la clase JFrame

Cambiar el tamaño de la

ventana

Agregar componentes

gráficos

Cambiar el título de la ventana

Page 50: interfaz grafica

Métodos de JFrame

• setSize ( ancho, alto )• setResizable ( true/false )• setTitle ( titulo )• setDefaultCloseOperation ( EXIT_ON_CLOSE)• setVisible ( true/false )• add ( componente )

Page 51: interfaz grafica

Configuración de la ventana en el método Constructor

public InterfazImpuestosCarro( ){

setTitle( "Cálculo impuestos" );setSize( 290, 350 );setResizable( false );setDefaultCloseOperation( EXIT_ON_CLOSE );setLayout( new BorderLayout( ) );

}

Page 52: interfaz grafica

Distribuidor gráfico de elementos (layout)

• Se encarga de distribuir los elementos (NO tenemos que hacerlo)

• Sólo tenemos que asociar a la ventana un objeto de este tipo (clase) que se encargue de hacerlo

• Java (swing) tiene varios distribuidores gráficos (varias clases). En APO1 vamos a ver dos:– BorderLayout– GridLayout

Page 53: interfaz grafica

Configuración de la ventana en el método Constructor

public InterfazImpuestosCarro( ){

setTitle( "Cálculo impuestos" );setSize( 290, 350 );setResizable( false );setDefaultCloseOperation( EXIT_ON_CLOSE );setLayout( new BorderLayout( ) );

}

Page 54: interfaz grafica

Divisiones y Paneles

Page 55: interfaz grafica

El Calculador de Impuestos –Interfaz usuario

InterfazImpuestosCarro (JFrame)

3 Zonas de trabajo:

PanelVehiculo (JPanel)

PanelDescuentos (JPanel)

PanelResultados (JPanel)

Page 56: interfaz grafica

Un Panel

• Se encarga de agrupar elementos gráficos por contenido y uso

• Facilita al usuario su localización y su uso• Cada panel se implementa como una clase

aparte en el modelo– PanelVehiculo– PanelDescuentos– PanelResultados

Page 57: interfaz grafica

El Calculador de Impuestos (Interfaz)

principal

principal

Page 58: interfaz grafica

Clase InterfazImpuestosCarro

Page 59: interfaz grafica

Creación de los paneles en el método Constructor

public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

}

Se declara un atributo por cada una de las divisiones

Page 60: interfaz grafica

Creación de los paneles en el método Constructor

public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

}

Se asocia a la ventana un distribuidor gráfico

Page 61: interfaz grafica

Creación de los paneles en el método Constructor

public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

panelDescuentos = new PanelDescuentos( );add( panelDescuentos, BorderLayout.CENTER );

panelResultados = new PanelResultados( this );add( panelResultados, BorderLayout.SOUTH );

}

Se crea una instancia de cada uno de los paneles

Page 62: interfaz grafica

Creación de los paneles en el método Constructor

public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

panelDescuentos = new PanelDescuentos( );add( panelDescuentos, BorderLayout.CENTER );

panelResultados = new PanelResultados( this );add( panelResultados, BorderLayout.SOUTH );

}

Se agrega cada panel en una posición de las definidas en el distribuidor gráfico

Page 63: interfaz grafica

Creación de los paneles en el método Constructor

public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

panelDescuentos = new PanelDescuentos( );add( panelDescuentos, BorderLayout.CENTER );

panelResultados = new PanelResultados( this );add( panelResultados, BorderLayout.SOUTH );

}

Page 64: interfaz grafica

Analicemos la creación del panelVehiculo

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

Atributo panelVehiculo de la clase InterfazImpuestosCarro

Page 65: interfaz grafica

Analicemos la creación del panelVehiculo

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

Llamado al constructor de la clase PanelVehiculo

Page 66: interfaz grafica

Analicemos la creación del panelVehiculo

Parámetro del método constructor de la

clase PanelVehiculoConcepto

nuevo

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

Page 67: interfaz grafica

Analicemos la creación del panelVehiculo

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

Método de la clase JFrame para adicionar un componente

Page 68: interfaz grafica

Analicemos la creación del panelVehiculo

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

Objeto que se va a adicionar

Page 69: interfaz grafica

Analicemos la creación del panelVehiculo

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

Zona (posición relativa dentro de la ventana) donde se va a Concepto

nuevoadicionar el objeto. Es una

constante de la clase BorderLayout.

Page 70: interfaz grafica

Dos conceptos nuevos

• BorderLayout • this

Page 71: interfaz grafica

Dos conceptos nuevos

• BorderLayout• Distribuidor gráfico “en los Bordes”• Divide el espacio de la ventana en 5 zonas:

NORTH, CENTER, SOUTH, WEST, EAST.• Al agregar un componente a la ventana, SE

DEBE pasar como parámetro la zona donde se va a ubicar. Ejemplo:– add( panelVehiculo,

BorderLayout.NORTH );• Utiliza el tamaño definido para cada uno de

los componentes y asigna TODO el espacio sobrante al componente que se encuentre en la zona del centro

NORTH

SOUTH

WEST EASTCENTER

Page 72: interfaz grafica

Dos conceptos nuevos

• Otro distribuidor: GridLayout• Distribuidor gráfico “en Malla”• Divide el espacio de la ventana en filas y columnas.• La cantidad de filas y columnas se establecen en el

método constructor del GridLayout. Ejemplo:– setLayout( new GridLayout ( 4, 3 ) );

• Al agregar un componente a la ventana, NO SE DEBE especificar la posición. Esta es asignada en el orden de llegada (fila 1, fila 2, …)

• Ignora el tamaño definido para cada componente. Hace una distribución uniforme del espacio.

1 2 34 5 67 8 9

10 11 12

Fila 1

Fila 2

Fila 3

Fila 4

Page 73: interfaz grafica

Dos conceptos nuevos

• BorderLayout • this

Page 74: interfaz grafica

Dos conceptos nuevos

• this

• Es una variable de JAVA

• Hace referencia al objeto que está ejecutando un método

Page 75: interfaz grafica

Ejemplo de uso de thispublic class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

panelDescuentos = new PanelDescuentos( );add( panelDescuentos, BorderLayout.CENTER );

panelResultados = new PanelResultados( this );add( panelResultados, BorderLayout.SOUTH );

}

Page 76: interfaz grafica

Ejemplo de uso de this

Es la ventana principal, (objeto de la clase InterfazImpuestosCarro,

que es el “padre” del panel)

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

Para qué sirve? … VER MAS ADELANTE

Page 77: interfaz grafica

Hasta aquí hemos visto …

• Cómo construir la clase de la ventana principal (InterfazImpuestosCarro)

Ahora vamos a ver …

• Cómo construir las clases de los paneles (PanelVehiculo, PanelDescuentos, PanelResultados)

Page 78: interfaz grafica

Construcción de las clases de los paneles

• Proceso similar a la construcción de la clase de la ventana principal

• Al igual que la ventana principal, los paneles también son contenedores gráficos

Ventana Principal

JFrame

Page 79: interfaz grafica

Construcción de las clases de los paneles

• Proceso similar a la construcción de la clase de la ventana principal

• Al igual que la ventana principal, los paneles también son contenedores gráficos

Ventana Principal Panel

JPanelJFrame

Page 80: interfaz grafica

PanelVehiculopublic class PanelVehiculo extends JPanel{

public PanelVehiculo( ){

…setLayout( new GridLayout( 5, 2 ) );setPreferredSize( new Dimension( 0, 130 ) );…

}

Creación y asociación de un GridLayout de 5 filas y 2 columnas

Page 81: interfaz grafica

PanelVehiculopublic class PanelVehiculo extends JPanel{

public PanelVehiculo( ){

…setLayout( new GridLayout( 5, 2 ) );setPreferredSize( new Dimension( 0, 130 ) );…

}

Definir la altura del panel. No se define el ancho porque va a ser igual al de la ventana

130Clase de Java que permite definir un ancho y un alto usando un objeto

Page 82: interfaz grafica

PanelVehiculopublic class PanelVehiculo extends JPanel{

public PanelVehiculo( ){

…setLayout( new GridLayout( 5, 2 ) );setPreferredSize( new Dimension( 0, 130 ) );TitledBorder border = BorderFactory.createTitleBorder

(“Datos del vehículo”);border.SetTitleColor( Color.BLUE );setBorder( border );…

}

Se crea y se asocia un borde al panel para facilitar la identificación de las divisiones dentro de la ventana

Page 83: interfaz grafica

PanelDescuentospublic class PanelDescuentos extends JPanel{

public PanelVehiculo( ){

…setLayout( new GridLayout( 2, 2 ) );…

}

Creación y asociación de un GridLayout de 2 filas y 2 columnas

Page 84: interfaz grafica

PanelDescuentospublic class PanelDescuentos extends JPanel{

public PanelVehiculo( ){

…setLayout( new GridLayout( 2, 2 ) );TitledBorder border = BorderFactory.createTitleBorder

(“Descuentos”);border.SetTitleColor( Color.BLUE );setBorder( border );…

}

Se crea y se asocia un borde

Page 85: interfaz grafica

Etiquetas y

Zonas de Texto

Page 86: interfaz grafica

Etiquetas

• Permiten agregar un texto corto en la interfaz• Son objetos de la clase JLabel de Java• Algunos métodos de la clase JLabel:

– setText (texto);– setForeground ( color );

Cualquier constante de la clase Color de Java (BLACK, GREEN, RED, BLUE, …) o un nuevo color creado con 3 índices RGB

Page 87: interfaz grafica

Zonas de texto• Cumplen dos funciones:

– Permiten el ingreso de información por parte del usuario (ENTRADAS de los requerimientos funcionales)

– Permiten mostrar las respuestas calculadas por el programa • Son objetos de la clase JText de Java• Algunos métodos de la clase JLabel:

– getText ( ); Retorna la cadena de caracteres tecleada por el usuario. SIEMPRE es String.

Page 88: interfaz grafica

Zonas de texto• Cumplen dos funciones:

– Permiten el ingreso de información por parte del usuario (ENTRADAS de los requerimientos funcionales)

– Permiten mostrar las respuestas calculadas por el programa • Son objetos de la clase JText de Java• Algunos métodos de la clase JLabel:

– getText ( );– setText ( texto ); Despliega el texto que se

pasa como parámetro. Se usa para mostrar los resultados del programa.

Page 89: interfaz grafica

Zonas de texto• Cumplen dos funciones:

– Permiten el ingreso de información por parte del usuario (ENTRADAS de los requerimientos funcionales)

– Permiten mostrar las respuestas calculadas por el programa • Son objetos de la clase JText de Java• Algunos métodos de la clase JLabel:

– getText ( );– setText ( texto );– setEditable ( true / false)

Indica si el usuario puede o no modificar el texto (escribir encima)

Page 90: interfaz grafica

Zonas de texto• Cumplen dos funciones:

– Permiten el ingreso de información por parte del usuario (ENTRADAS de los requerimientos funcionales)

– Permiten mostrar las respuestas calculadas por el programa • Son objetos de la clase JTextField de Java• Algunos métodos de la clase JLabel:

– getText ( );– setText ( texto );– setEditable ( true / false)– setForeground (color )– setBackground ( color )

Definen respectivamente el color del texto y del fondo

Page 91: interfaz grafica

Cómo agregar una etiqueta (o una zona de texto) a un panelDeclarar en el panel un atributo de la clase JLabel (o JTextField)Crear la etiqueta (o la zona de texto) (new) en el método constructor del panelConfigurar las características de la etiqueta (o de la zona de texto) con los métodos de la clase JLabel (o JTextField)Agregar la etiqueta (o la zona de texto) al panel (add)

Page 92: interfaz grafica

Ejemplo en PanelVehiculopublic class PanelVehiculo extends JPanel

{…private JLabel labMarca;private JLabel labLinea;private JLabel labModelo;private JLabel labValor;

private JTextField txtMarca;private JTextField txtLinea;private JTextField txtModelo;private JTextField txtValor;

…}

Declarar en el panel los atributos de clases JLabel yJTextField

Page 93: interfaz grafica

Ejemplo en PanelVehiculopublic PanelVehiculo ( ){

…labMarca = new JLabel ( “Marca” );labLinea = new JLabel ( “Línea” );labModelo = new JLabel ( “ Modelo” );labValor = new JLabel ( “ Valor” );

txtMarca = new JTextField( );txtLinea = new JTextField( );txtModelo = new JTextField( );txtValor = new JTextField( “$ 0” );…}

Crear las etiquetasy las zonas de texto (new) en el método constructor del panel

Page 94: interfaz grafica

Ejemplo en PanelVehiculopublic PanelVehiculo ( ){

…labMarca = new JLabel ( “Marca” );labLinea = new JLabel ( “Línea” );labModelo = new JLabel ( “ Modelo” );labValor = new JLabel ( “ Valor” );

txtMarca = new JTextField( );txtLinea = new JTextField( );txtModelo = new JTextField( );txtValor = new JTextField( “$ 0” );

txtValor.SetEditable(false);txtValor.SetForeground(Color.BLUE);txtValor.SetBackground(Color.WHITE);…}

Configurar las características de las etiquetas o de las zonas de texto con los métodos de las clases JLabel o JTextField

Page 95: interfaz grafica

Ejemplo en PanelVehiculopublic PanelVehiculo ( )

{…labMarca = new JLabel ( “Marca” );labLinea = new JLabel ( “Línea” );labModelo = new JLabel ( “ Modelo” );labValor = new JLabel ( “ Valor” );

txtMarca = new JTextField( );txtLinea = new JTextField( );txtModelo = new JTextField( );txtValor = new JTextField( “$ 0” );

txtValor.SetEditable(false);txtValor.SetForeground(Color.BLUE);txtValor.SetBackground(Color.WHITE);

add( labMarca );add( txtMarca );add( labLinea );add( txtLinea );add( labModelo );add( txtModelo );add( labValor );add( txtValor );

}

Agregar las etiquetasy las zonas de textoal panel (add)

Page 96: interfaz grafica

Selección de Opciones por medio de Cajas de

Chequeo

Page 97: interfaz grafica

Cajas de chequeo

• Permiten al usuario seleccionar o deseleccionar una opción.

• Son objetos de la clase JCheckBox de Java• Algunos métodos de la clase JCheckBox:

– isSelected ( ); Indica (true/false) si el usuario seleccionó la opción

Page 98: interfaz grafica

Cajas de chequeo

• Permiten al usuario seleccionar o deseleccionar una opción.

• Son objetos de la clase JCheckBox de Java• Algunos métodos de la clase JCheckBox:

– isSelected ( );

– setSelected ( true/false ); Marca como seleccionado o no, la caja de chequeo

Page 99: interfaz grafica

Ejemplo en PanelDescuentospublic class PanelDescuentos extends JPanel{

…private JCheckBox cbPago;private JCheckBox cbSPublico;private JCheckBox cbTCuenta;

…}

Declarar en el panel los atributos de clase JCheckBox

Page 100: interfaz grafica

Ejemplo en PanelDescuentospublic PanelDescuentos ( ){

…cbPago = new JCheckBox ( “Pronto pago” );cbSPublico = new JCheckBox ( “Servicio público” );cbTCuenta = new JCheckBox ( “Traslado de cuenta” );…

} Crear las cajas de chequeo (new) en el método constructor del panel

Page 101: interfaz grafica

Ejemplo en PanelDescuentospublic PanelDescuentos ( ){

…cbPago = new JCheckBox ( “Pronto pago” );cbSPublico = new JCheckBox ( “Servicio público” );cbTCuenta = new JCheckBox ( “Traslado de cuenta” );

add( cbPago );add( cbTCuenta );add( cbSPublico );

…}

Agregar las cajas de chequeo al panel (add)

Page 102: interfaz grafica

Interacción con la aplicación mediante

Botones

Page 103: interfaz grafica

Botones

• Permiten al usuario expresar sus órdenes al programa (es el mecanismo más simple de interacción).

• Son objetos de la clase JButton de Java• La clase JButton tiene DOS METODOS

especiales:– setActionCommand ( evento );– addActionListener ( panel );

Page 104: interfaz grafica

Ejemplo en PanelResultadospublic class PanelResultados extends JPanel{

…private JLabel labTotal;private JTextField txtTotal;

private JButton butLimpiar;private JButton butCalcular;…

}

Declarar en el panel los atributos de clase JButton

Page 105: interfaz grafica

Ejemplo en PanelResultadospublic PanelResultados ( ){

…labTotal = new JLabel ( “Total a pagar” );txtTotal = new JTextField ( “$ 0” );

butLimpiar = new JButton ( “Limpiar” );butCalcular = new JButton ( “Calcular” );…

}

Crear los botones(new) en el método constructor del panel

Page 106: interfaz grafica

Ejemplo en PanelResultadospublic PanelResultados ( ){

…labTotal = new JLabel ( “Total a pagar”

);txtTotal = new JTextField ( “$ 0” );

butLimpiar = new JButton ( “Limpiar” );butCalcular = new JButton ( “Calcular” );

txtTotal.SetEditable( false );txtTotal.SetForeground( Color.BLUE );txtTotal.SetBackground( Color.WHITE );

add( new Jlabel( “”) );add( new Jlabel( “”) );add(butLimpiar);add(labTotal);add(txtTotal);add(butCalcular);…

}

Agregar los botones al panel (add)

Page 107: interfaz grafica

Acciones del Usuario y

Eventos de la aplicación

Page 108: interfaz grafica

Acciones y Eventos

Interfaz usuario

llamada a un método

evento

Modelo del mundoUsuario

• El usuario ejecuta acciones:– Hace click sobre un botón– Chequea una caja de

chequeo– Selecciona una opción de

un Menú– …

• Las acciones se convierten en objetos llamados eventos:– Describen lo que el usuario

hizo– Se puede analizar su

contenido para que el programa reaccione de acuerdo a la acción del usuario

Page 109: interfaz grafica

Cómo manejar un evento con un botón de la interfaz en 3 pasos … y no morir en el intento:

Dar un nombre al evento y asociarlo a un botón

public class PanelResultados extends JPanel{

…public final static String LIMPIAR = “limpiar”;public final static String CALCULAR = “calcular”;

public PanelResultados( ){

…butLimpiar.SetActionCommand ( LIMPIAR );butCalcular.SetActionCommand ( CALCULAR );…

}…

}

Se declaran constantes para los nombres de los eventos

En la clase del panel que contiene el botón

Page 110: interfaz grafica

Cómo manejar un evento con un botón de la interfaz en 3 pasos … y no morir en el intento:

Dar un nombre al evento y asociarlo a un botón

public class PanelResultados extends JPanel{

…public final static String LIMPIAR = “limpiar”;public final static String CALCULAR = “calcular”;

public PanelResultados( ){

…butLimpiar.SetActionCommand ( LIMPIAR );butCalcular.SetActionCommand ( CALCULAR );…

}…

}

Se asocian los nombres de los eventos con cada botón

En el método constructor del panel

Page 111: interfaz grafica

Cómo manejar un evento con un botón de la interfaz en 3 pasos … y no morir en el intento:

Atender el evento

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

// Reacción al evento de LIMPIAR}else if (comando.equals( CALCULAR ) )

// Reacción al evento de CALCULAR}

}

Agregar una declaración en el encabezado de la clase del panel que contiene el botón (para que pueda “percibir” las acciones del usuario)

Page 112: interfaz grafica

Cómo manejar un evento con un botón de la interfaz en 3 pasos … y no morir en el intento:

Atender el evento

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

// Reacción al evento de LIMPIAR}else if (comando.equals( CALCULAR ) ){

// Reacción al evento de CALCULAR}

}

Implementar en la clase del panel que contiene el botón, el método especial actionPerformed

parámetro del método: evento ocurrido en el panel

Page 113: interfaz grafica

Cómo manejar un evento con un botón de la interfaz en 3 pasos … y no morir en el intento:

Atender el evento

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

// Reacción al evento de LIMPIAR}else if (comando.equals( CALCULAR ) ){

// Reacción al evento de CALCULAR}

}

Implementar en la clase del panel que contiene el botón, el método especial actionPerformed

parámetro del método: evento ocurrido en el panel

Page 114: interfaz grafica

Cómo manejar un evento con un botón de la interfaz en 3 pasos … y no morir en el intento:

Atender el evento

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

// Reacción al evento de LIMPIAR}else if (comando.equals( CALCULAR ) ){

// Reacción al evento de CALCULAR}

}

Métodos de la ventana principal !!!

Page 115: interfaz grafica

Cómo manejar un evento con un botón de la interfaz en 3 pasos … y no morir en el intento:

Atender el evento

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

// Reacción al evento de LIMPIAR}else if (comando.equals( CALCULAR ) ){

// Reacción al evento de CALCULAR}

Cada vez que el usuario hace click

en un botón del panel, se ejecuta el

método actionPerformed

}

Page 116: interfaz grafica

Cómo manejar un evento con un botón de la interfaz en 3 pasos … y no morir en el intento:

Decir que el panel es el encargado de atender el evento

public class PanelResultados extends JPanel implements ActionListener{

…public PanelResultados ( ){

butLimpiar.addActionListener (this);butCalcular.addActionListener (this);

}…

}

Mediante el método addActionListener de la clase JButton

parámetro del método: el objeto que lo estáejecutando, es decir el panel mismo

Page 117: interfaz grafica

Arquitectura y Distribución de

Responsabilidades

Page 118: interfaz grafica

Qué vamos a aprender …• Coordinar los elementos de la interfaz y del

modelo del mundo para satisfacer los requerimientos funcionales

• Estructurar y repartir las responsabilidades• Una propuesta de arquitectura:

– Facilita la localización de componentes del programa– Aumenta la claridad– Facilita el mantenimiento

Page 119: interfaz grafica

Por dónde comienza la ejecución del programa?

• Por el método main de la ventana principal• Su función: crear una instancia de la

ventana y hacerla visible en la pantalla

public class InterfazImpuestosCarro extends JFrame{ …

public static void main( String[] args ){

InterfazImpuestosCarro vent = new InterfazImpuestosCarro( );vent.setVisible( true );

}…

}

Page 120: interfaz grafica

Quién crea el modelo del mundo?• La interfaz• En el método constructor de la ventana

principalpublic class InterfazImpuestosCarro extends JFrame{ …private CalculadorImpuestos calculador;

public InterfazImpuestosCarro( ) throws Exception{

calculador = new CalculadorImpuestos( );…

}…

}

Page 121: interfaz grafica

Arquitectura propuesta

• Los requerimientos funcionales se implementan en la ventana principal:

– Hay UN método por REQUERIMIENTO

– La ventana principal coordina todas las acciones

Page 122: interfaz grafica

Reacción a un evento generado por el usuario (1 de 6 pasos)

El usuario genera un evento oprimiendo un botón en uno de los paneles de la interfaz

Page 123: interfaz grafica

Reacción a un evento generado por el usuario (2 de 6 pasos)

El panel reacciona al evento con SU método actionPerformed

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

// Reacción al evento de LIMPIAR}else if (comando.equals( CALCULAR ) ){

// Reacción al evento de CALCULAR}

}…

}

Page 124: interfaz grafica

Reacción a un evento generado por el usuario (2 de 6 pasos)

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

// Reacción al evento de LIMPIAR}else if (comando.equals( CALCULAR ) ){

// Reacción al evento de CALCULAR}

}…

}

Llamado a métodos de la ventana principal !!!

Hay UN método por REQUERIMIENTO

Page 125: interfaz grafica

Reacción a un evento generado por el usuario (2 de 6 pasos)

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

principal.limpiar( );}else if (comando.equals( CALCULAR ) )

Método “limpiar” de la ventana principal

{principal.calcularImpuestos( );

}}…

}

Método “calcularImpuestos”de la ventana principal

Page 126: interfaz grafica

Reacción a un evento generado por el usuario (2 de 6 pasos)

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

principal.limpiar( );}else if (comando.equals( CALCULAR ) ){

principal.calcularImpuestos( );}

}…

}

• Quién es “principal”?• Dónde está ?• Quién lo conoce ?

Page 127: interfaz grafica

principal

principal

• Quién es “principal”?R// Es el objeto que contiene la ventana principal

• Dónde está ?R// Es un atributo (asociación) de las clases panelResultados y

panelVehiculo

• Quién lo conoce ?R// Las clases que lo contienen como atributo

Page 128: interfaz grafica

Entonces …public class PanelVehiculo extends JPanel implements ActionListener{

…private InterfazImpuestosCarro principal;…

public PanelVehiculo( InterfazImpuestosCarro v){

…principal = v;…

}…

}

La clase del panel contiene un atributo del tipo de la ventana principal

Page 129: interfaz grafica

Entonces …public class PanelVehiculo extends JPanel implements ActionListener{

…private InterfazImpuestosCarro principal;…

public PanelVehiculo( InterfazImpuestosCarro v){

…principal = v;…

}…

}

El método constructor del panel DEBE recibir como parámetro, el objeto correspondiente a la ventana principal

Page 130: interfaz grafica

Entonces …public class PanelVehiculo extends JPanel implements ActionListener{

…private InterfazImpuestosCarro principal;…

public PanelVehiculo( InterfazImpuestosCarro v){

…principal = v;…

}…

}Se asigna el parámetro al atributo

Page 131: interfaz grafica

Entonces …public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

panelDescuentos = new PanelDescuentos( );add( panelDescuentos, BorderLayout.CENTER );

panelResultados = new PanelResultados( this );add( panelResultados, BorderLayout.SOUTH );

}

En el método constructor de la ventana principal

Page 132: interfaz grafica

Entonces …public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

panelDescuentos = new PanelDescuentos( );add( panelDescuentos, BorderLayout.CENTER );

panelResultados = new PanelResultados( this );add( panelResultados, BorderLayout.SOUTH );

}

Cuando se crean los paneles

Page 133: interfaz grafica

Entonces …public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

panelDescuentos = new PanelDescuentos( );add( panelDescuentos, BorderLayout.CENTER );

panelResultados = new PanelResultados( this );add( panelResultados, BorderLayout.SOUTH );

}

Se pasa como parámetro la ventana principal (this) a los métodos constructores de los paneles que la necesitan

Page 134: interfaz grafica

Entonces …public class InterfazImpuestosCarro extends JFrame{

private PanelVehiculo panelVehiculo;private PanelDescuentos panelDescuentos;private PanelResultados panelResultados;

public InterfazImpuestosCarro( ) throws Exception{

setLayout( new BorderLayout( ) );

panelVehiculo = new PanelVehiculo( this );add( panelVehiculo, BorderLayout.NORTH );

panelDescuentos = new PanelDescuentos( );add( panelDescuentos, BorderLayout.CENTER );

panelResultados = new PanelResultados( this );add( panelResultados, BorderLayout.SOUTH );

}

Se agrega cada panel en una posición de las definidas en el distribuidor gráfico

En el método constructor de la ventana principal

Page 135: interfaz grafica

Recordemos (1 de 6 pasos)…

El usuario genera un evento oprimiendo un botón en uno de los paneles de la interfaz

Page 136: interfaz grafica

Recordemos (2 de 6 pasos)…

El panel reacciona al evento con SU método actionPerformed dentro del cual se analiza el evento y se llama al método correspondiente de la ventana principal

public class PanelResultados extends JPanel implements ActionListener{

…public void actionPerformed (ActionEvent evento ){

String comando = evento.getActionCommand( );if ( (comando.equals( LIMPIAR) ){

principal.limpiar( );}else if (comando.equals( CALCULAR ) ){

principal.calcularImpuestos( );}

}…

}

Page 137: interfaz grafica

Reacción a un evento generado por el usuario (3 de 6 pasos)

El método de la ventana principal:

Completa la información necesaria, pidiéndola a los demás paneles

public void calcularImpuestos( ){

String unaMarca = panelVehiculo.darMarca( );String unaLinea = panelVehiculo.darLinea( );String unModelo = panelVehiculo.darModelo( );

}

Page 138: interfaz grafica

Entonces …public class PanelVehiculo extends JPanel implements ActionListener

{…

public String darMarca( ){

return txtMarca.getText( );}

…}

Existen métodos para pasar la información a la ventana principal

En la clase del panel respectivo

Page 139: interfaz grafica

Volviendo al paso 3 de 6

El método de la ventana principal:

Completa la información necesaria, pidiéndola a los demás paneles

public void calcularImpuestos( ){

String unaMarca = panelVehiculo.darMarca( );String unaLinea = panelVehiculo.darLinea( );String unModelo = panelVehiculo.darModelo( );

}

Page 140: interfaz grafica

Volviendo al paso 3 de 6

El método de la ventana principal:

Completa la información necesaria, pidiéndola a los demás panelesVerifica que la información esté completa y sea válida

public void calcularImpuestos( ){

String unaMarca = panelVehiculo.darMarca( );String unaLinea = panelVehiculo.darLinea( );String unModelo = panelVehiculo.darModelo( );

if( unaMarca.equals( "" ) || unaLinea.equals( "" ) || unModelo.equals( "" ) ){

JOptionPane.showMessageDialog( this, "Por favor llene todos los datos", "Cálculo de Impuestos", JOptionPane.ERROR_MESSAGE );

}else{

….}

}

Page 141: interfaz grafica

Volviendo al paso 3 de 6public void calcularImpuestos( ){

String unaMarca = panelVehiculo.darMarca( );String unaLinea = panelVehiculo.darLinea( );String unModelo = panelVehiculo.darModelo( );

if( unaMarca.equals( "" ) || unaLinea.equals( "" ) || unModelo.equals( "" ) ){

JOptionPane.showMessageDialog( this, "Por favor llene todos los datos", "Cálculo de Impuestos", JOptionPane.ERROR_MESSAGE );

}else{

….}

}

En caso de problema, puede cancelar la reacción y notificar al usuario del problema

Page 142: interfaz grafica

Reacción a un evento generado por el usuario (4 de 6 pasos)

public void calcularImpuestos( ){

…if( unaMarca.equals( "" ) || …{

JOptionPane.showMessageDialog …}else{

boolean descProntoPago = panelDescuentos.hayDescuentoProntoPago( );boolean descServicioPublico = panelDescuentos.hayDescuentoServicioPublico( );boolean descTrasladoCuenta = panelDescuentos.hayDescuentoTrasladoCuenta( );try{

double pago = calculador.calcularPago( unaMarca, unaLinea, unModelo, descProntoPago,descServicioPublico, descTrasladoCuenta );

panelResultados.refrescarPago( pago );}catch( Exception e ){

JOptionPane.showMessageDialog( this, e.getMessage( ), "Cálculo de Impuestos", JOptionPane.WARNING_MESSAGE );

}}

}}

El método de la ventana principal:

Pide al modelo del mundo que haga una modificación o calcule un valor

Page 143: interfaz grafica

Entonces …La ventana principal DEBE conocer el mundo para poder llamar a sus métodos

principal

principal

calculador

Page 144: interfaz grafica

Entonces …public class InterfazImpuestosCarro extends JFrame

{/** Calculador de impuestos */private CalculadorImpuestos calculador;

….

public InterfazImpuestosCarro( ) throws Exception

{// Crea el calculador de impuestoscalculador = new CalculadorImpuestos( );

// Configura la información de la ventanasetTitle( "Cálculo impuestos" );…

}

}

La clase de la ventana principal contiene un atributo que es el objeto del mundo (de la clase principal del mundo)

Page 145: interfaz grafica

Entonces …public class InterfazImpuestosCarro extends JFrame

{/** Calculador de impuestos */private CalculadorImpuestos calculador;

….

public InterfazImpuestosCarro( ) throws Exception

{// Crea el calculador de impuestoscalculador = new CalculadorImpuestos( );

// Configura la información de la ventanasetTitle( "Cálculo impuestos" );…

}

}

En el método constructor de la ventana principal, se crea el objeto del mundo

Page 146: interfaz grafica

Volviendo al paso 4 de 6public void calcularImpuestos( )

{…if( unaMarca.equals( "" ) || …{

JOptionPane.showMessageDialog …}else{

boolean descProntoPago = panelDescuentos.hayDescuentoProntoPago( );boolean descServicioPublico = panelDescuentos.hayDescuentoServicioPublico( );boolean descTrasladoCuenta = panelDescuentos.hayDescuentoTrasladoCuenta( );try{

double pago = calculador.calcularPago( unaMarca, unaLinea, unModelo, descProntoPago,descServicioPublico, descTrasladoCuenta );

panelResultados.refrescarPago( pago );}catch( Exception e ){

JOptionPane.showMessageDialog( this, e.getMessage( ), "Cálculo de Impuestos", JOptionPane.WARNING_MESSAGE );

}}

}}

El método de la ventana principal:

Pide al modelo del mundo que haga una modificación o calcule un valor

Page 147: interfaz grafica

Reacción a un evento generado por el usuario (5 de 6 pasos)

public void calcularImpuestos( ){

…if( unaMarca.equals( "" ) || …{

JOptionPane.showMessageDialog …}else{

boolean descProntoPago = panelDescuentos.hayDescuentoProntoPago( );boolean descServicioPublico = panelDescuentos.hayDescuentoServicioPublico( );boolean descTrasladoCuenta = panelDescuentos.hayDescuentoTrasladoCuenta( );try{

double pago = calculador.calcularPago( unaMarca, unaLinea, unModelo, descProntoPago,descServicioPublico, descTrasladoCuenta );

panelResultados.refrescarPago( pago );}catch( Exception e ){

JOptionPane.showMessageDialog( this, e.getMessage( ), "Cálculo de Impuestos", JOptionPane.WARNING_MESSAGE );

}}

}}

El método de la ventana principal:

Pide al modelo del mundo que haga una modificación o calcule un valorSi se pidióuna modificación, se llaman los métodos que retornan los nuevos valores que se deben desplegar

Page 148: interfaz grafica

Reacción a un evento generado por el usuario (6 de 6 pasos)

public void calcularImpuestos( ){

…if( unaMarca.equals( "" ) || …{

JOptionPane.showMessageDialog …}else{

boolean descProntoPago = panelDescuentos.hayDescuentoProntoPago( );boolean descServicioPublico = panelDescuentos.hayDescuentoServicioPublico( );boolean descTrasladoCuenta = panelDescuentos.hayDescuentoTrasladoCuenta( );try{

double pago = calculador.calcularPago( unaMarca, unaLinea, unModelo, descProntoPago,descServicioPublico, descTrasladoCuenta );

panelResultados.refrescarPago( pago );}catch( Exception e ){

JOptionPane.showMessageDialog( this, e.getMessage( ), "Cálculo de Impuestos", JOptionPane.WARNING_MESSAGE );

}}

}}

El método de la ventana principal:

Pide a todos los paneles que tienen información que pudo haber cambiado, que actualicen sus valores (REFRESCO)

Page 149: interfaz grafica

Entonces …En la clase del panel (Panelresultados) existe el método refrescarPago

/*** Cambia el valor desplegado del pago* @param pago - nuevo pago a desplegar*/

public void refrescarPago( double pago ){

//Despliega el valor del vehiculoDecimalFormat df = ( DecimalFormat )NumberFormat.getInstance( );df.applyPattern( "$ ###,###.##" );txtTotal.setText( df.format( pago ) );

}

Page 150: interfaz grafica

Entonces …/**

* Cambia el valor desplegado del pago* @param pago - nuevo pago a desplegar*/

public void refrescarPago( double pago ){

//Despliega el valor del vehiculoDecimalFormat df = ( DecimalFormat )NumberFormat.getInstance( );df.applyPattern( "$ ###,###.##" );txtTotal.setText( df.format( pago ) );

}

Utiliza la clase DecimalFormat de Java para dar un formato especial a un número

Page 151: interfaz grafica

Entonces …/**

* Cambia el valor desplegado del pago* @param pago - nuevo pago a desplegar*/

public void refrescarPago( double pago ){

//Despliega el valor del vehiculoDecimalFormat df = ( DecimalFormat )NumberFormat.getInstance( );df.applyPattern( "$ ###,###.##" );txtTotal.setText( df.format( pago ) );

}

Pone el valor del pago en la zona de texto llamada txtTotal, en formato String

Page 152: interfaz grafica

Validación y Formateo de Datos

Page 153: interfaz grafica

Qué pasa con la información tecleada por el usuario en una

zona de texto• La información SIEMPRE es recibida por la

interfaz como cadena de caracteres• La interfaz tiene la responsabilidad de:

Convertirla al tipo adecuado (ej: entero o minúsculas)Advertir al usuario si hay algún error, cuando el usuario teclea algo que no corresponde a lo esperado (ej: teclea una letra y se espera un número)

Page 154: interfaz grafica

Para convertir la cadena de caracteres al tipo adecuado …

• A un número:– Se usa el método parseInt de la clase Integer de Java.– Se captura la excepción NumberFormatException que lanza el método

parseInt si la cadena no se puede convertir en número

try{int nCantidad = Integer.parseInt ( strCantidad );

}catch (NumberFormatException e){

// Mensaje al usuario}

Page 155: interfaz grafica

Para convertir la cadena de caracteres al tipo adecuado …

• A mayúsculas/minúsculas (y otros tipos de conversión de cadenas de caracteres):– La clase String de Java provee métodos para

transformar la cadena de caracteres tecledadapor el usuario (y en general cualquier cadena de caracteres):

• toLowerCase(): pasa a minúsculas• toUpperCase(): pasa a mayúsculas• Trim: elimina espacios en blanco al inicio y final de la

cadena

Page 156: interfaz grafica

Mensajes al Usuario y Lectura Simple de Datos

Page 157: interfaz grafica

Mensajes en la ConsolaSystem.out.println(“Este en un mensaje de prueba de ERROR”);

Si se ejecuta desde eclipse, el mensaje aparece en la ventana Console

Si se ejecuta por fuera de eclipse (con run.bat)

Page 158: interfaz grafica

Mensajes en una ventanaJOptionPane.showMessageDialog

JOptionPane.showMessageDialog( this, "Por favor llene todos los datos", "Calculo de Impuestos", JOptionPane.ERROR_MESSAGE );

Debe ser null si se usa en el main

JOptionPane.showMessageDialog( null, "La marca ferrari no estáregistrada", "Calculo de Impuestos", JOptionPane.WARNING_MESSAGE );

JOptionPane.showMessageDialog( this, "El valor total es de $12.000", "Calculo de Impuestos", JOptionPane.INFORMATION_MESSAGE );

Page 159: interfaz grafica

Para pedir información al usuarioJOptionPane.showInputDialog Debe ser null si se usa

en el main

String clave = JOptionPane.showInputDialog( this, "Introduzca su clave");

if ( clave != null){

…}

int resp = JOptionPane.showConfirmDialog( null, "Está seguro que lo desea borrar?", "Confirmacion", JOptionPane.YES_NO_OPTION);

if ( resp == JOptionPane.YES_OPTION){

...}

JOptionPane.showConfirmDialog