Nychol Bazurto Gómez
Interfaz gráfica
Distribuciones
Creación de la
Manejo de eventos
Ejecuta operaciones sobre el modelo del mundo.
Usuario siente que está visualizando e interactuando directamente con los elementos del modelo del mundo
Un
Esperamos que sea agradable y fácil de utilizar
Condiciones mínimas que influyen en la percepción
Los elementos de interacción se comporten de forma intuitiva.
Cantidad de conocimiento que el usuario debe tener para utilizar el programa.
Asignación de responsabilidades
Cómo estructurar la interfaz de usuario y cómo comunicarla con las clases del modelo del mundo, sin mezclar en ningún momento las responsabilidades de esos dos componentes de un programa.
Etiquetas
Botones
Campos de texto
Caja de chequeo
Imágenes
Etiquetas
Botónes
Campos de texto
Caja de chequeo
Imágenes
Controles para cerrar el programa
Título
La ventana principal será un objeto de la clase InterfazEmpleado
La ventana principal será un objeto de la clase InterfazEmpleado
Como cualquier clase:
Diferencia:
package uniandes.cupi2.empleado.interfaz;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import uniandes.cupi2.empleado.mundo.Empleado;
import uniandes.cupi2.empleado.mundo.Fecha;
/**
* Ventana principal de la aplicación.
*/
public class InterfazEmpleado extends JFrame
{
}Se importan las clases del modelo del mundo
Se agrega extends JFrame para indicar que es una ventana
¿Cómo cambiar el estado (apariencia) de la ventana?
Con los métodos de la clase JFrame que nos permiten
Al tener la interfaz principal (ventana principal), debemos dividirla en páneles (que en Java son JPanel) según alguna de las siguientes dos distribuciones (Layout):
BorderLayout: distribución de bordes geográficos (norte, sur, este, oeste y centro).
GridLayout: distribución de cuadrícula en la que cada casilla tiene la misma dimensión, se debe especificar la cantidad de filas y columnas de la cuadrícula.
Al tener la interfaz principal (ventana principal), debemos dividirla en páneles (que en Java son JPanel) según alguna de las siguientes dos distribuciones (Layout):
add( panelVehiculo, BorderLayout.NORTH );Objeto que se va a adicionar
Zona (posición relativa dentro de la ventana) donde se va a adicionar el objeto. Es una constante de la clase BorderLayout.
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, …)
setLayout( new GridLayout ( 4, 3 ) );
add( panelVehiculo);
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
¿Para el
A su vez cada pánel tiene su distribución
El panel ubicado en el Norte de interfaz principal, su distribución puede ser BorderLayout (con una imagen en el centro ó GridLayout (con tamaño 1x1).
A su vez cada pánel tiene su distribución
Panel ubicado en Sur de interfaz principal, su distribución es GridLayout, con tamaño 1x3 (1 fila y 3 columnas).
Panel ubicado en Este de Interfaz principal, su distribución es GridLayout, con tamaño 6x1 (6 filas y 1 columna).
A su vez cada pánel tiene su distribución
Panel ubicado en Centro de Interfaz principal, su distribución es BoderLayout, con tamaño 3 sub-páneles.
A su vez cada pánel tiene su distribución
A su vez cada pánel tiene su distribución
A su vez cada pánel tiene su distribución
/**
* Ventana principal de la aplicación.
*/
public class InterfazMuseo extends JFrame
{
// -----------------------------------------------------------------
// Atributos
// -----------------------------------------------------------------
/**
* Clase principal del mundo.
*/
private Museo museo;
// -----------------------------------------------------------------
// Atributos de la interfaz
// -----------------------------------------------------------------
/**
* Panel con la imagen del banner.
*/
private PanelImagen panelImagen;
/**
* Panel con la información de la obra.
*/
private PanelInformacion panelInformacion;
/**
* Panel para calificar la obra.
*/
private PanelCalificacion panelCalificacion;
/**
* Panel para ejecutar las extensiones a la aplicación.
*/
private PanelOpciones panelOpciones;public InterfazMuseo( )
{
setLayout( new BorderLayout( ) );
panelInformacion = new PanelInformacion( this );
add( panelInformacion, BorderLayout.CENTER );
panelCalificacion = new panelCalificacion( );
add( panelOpciones, BorderLayout.EAST );
panelOpciones = new panelOpciones( this );
add( panelOpciones, BorderLayout.SOUTH );
}Atributo panelInformacion de la clase InterfazMuseo
Llamado al constructor de la clase PanelInformacion
public InterfazMuseo( )
{
setLayout( new BorderLayout( ) );
panelInformacion = new PanelInformacion( this );
add( panelInformacion, BorderLayout.CENTER );
panelCalificacion = new panelCalificacion( );
add( panelOpciones, BorderLayout.EAST );
panelOpciones = new panelOpciones( this );
add( panelOpciones, BorderLayout.SOUTH );
}Parámetro
CONCEPTO NUEVO!
Es una variable de JAVA
Hace referencia al objeto que está ejecutando un método
Es la ventana principal, (objeto de la clase InterfazMuseo, que es el “padre” del panel)
Adentro del método se crea una nueva InterfazMuseo y se vuelve visible.
Para mostrar ventanas de mensajes al usuario, se utiliza la clase JOptionPane y dos métodos
En el manejo de eventos se explicará como utilizar cada uno de estos métodos.
evento
llamada a un método
El usuario ejecuta acciones:
Las acciones se convierten en objetos llamados eventos:
Hay tres pasos que se deben seguir para decidir la manera de manejar un evento con un botón de la interfaz
Decidir el nombre del evento y asociarlo con un botón.
Implementar el método que va a atender el evento
Declarar que el panel es el responsable de atender los eventos de sus botones.
Decidir el nombre del evento y asociarlo con un botón.
public class PanelConsultas extends JPanel implements ActionListener
{
// -----------------------------------------------------------------
// Constantes
// -----------------------------------------------------------------
/**
* Constante para calcular la edad del empleado.
*/
private final static String CALCULAR_EDAD = "CALCULAR EDAD";
/**
* Constante para calcular la antigüedad del empleado.
*/
private final static String CALCULAR_ANTIGUEDAD = "CALCULAR ANTIGUEDAD";
...
public PanelConsultas( InterfazEmpleado pPrincipal )
{
...
btnEdad = new JButton( );
btnEdad.setText( "Calcular edad" );
btnEdad.setActionCommand( PanelConsultas.CALCULAR_EDAD );
btnAntiguedad = new JButton( );
btnAntiguedad.setText( "Calcular antigüedad" );
btnAntiguedad.setActionCommand( PanelConsultas.CALCULAR_ANTIGUEDAD );
}
}En la clase del panel que contiene el botón
Se declaran constantes para los nombres de los eventos
En el método constructor del panel
Se asocian los nombres de los eventos con cada botón
Atender el evento
public class PanelConsultas extends JPanel implements ActionListener
{
...
/**
* Manejo de los eventos de los botones.
* @param pEvento Acción que generó el evento. pEvento != null.
*/
public void actionPerformed( ActionEvent pEvento )
{
String command = pEvento.getActionCommand( );
if( command.equals( CALCULAR_EDAD ) )
{
principal.calcularEdadEmpleado( );
}
else if( command.equals( CALCULAR_ANTIGUEDAD ) )
{
principal.calcularAntiguedadEmpleado( );
}
else if( command.equals( CALCULAR_PRESTACIONES ) )
{
principal.calcularPrestacionesEmpleado( );
}
}
}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)
Atender el evento
public class PanelConsultas extends JPanel implements ActionListener
{
...
/**
* Manejo de los eventos de los botones.
* @param pEvento Acción que generó el evento. pEvento != null.
*/
public void actionPerformed( ActionEvent pEvento )
{
String command = pEvento.getActionCommand( );
if( command.equals( CALCULAR_EDAD ) )
{
principal.calcularEdadEmpleado( );
}
else if( command.equals( CALCULAR_ANTIGUEDAD ) )
{
principal.calcularAntiguedadEmpleado( );
}
else if( command.equals( CALCULAR_PRESTACIONES ) )
{
principal.calcularPrestacionesEmpleado( );
}
}
}Implementar en la clase del panel que contiene el botón, el método especial actionPerformed
Atender el evento
public class PanelConsultas extends JPanel implements ActionListener
{
...
/**
* Manejo de los eventos de los botones.
* @param pEvento Acción que generó el evento. pEvento != null.
*/
public void actionPerformed( ActionEvent pEvento )
{
String command = pEvento.getActionCommand( );
if( command.equals( CALCULAR_EDAD ) )
{
principal.calcularEdadEmpleado( );
}
else if( command.equals( CALCULAR_ANTIGUEDAD ) )
{
principal.calcularAntiguedadEmpleado( );
}
else if( command.equals( CALCULAR_PRESTACIONES ) )
{
principal.calcularPrestacionesEmpleado( );
}
}
}parámetro del método: evento ocurrido en el panel
Atender el evento
public class PanelConsultas extends JPanel implements ActionListener
{
...
/**
* Manejo de los eventos de los botones.
* @param pEvento Acción que generó el evento. pEvento != null.
*/
public void actionPerformed( ActionEvent pEvento )
{
String command = pEvento.getActionCommand( );
if( command.equals( CALCULAR_EDAD ) )
{
principal.calcularEdadEmpleado( );
}
else if( command.equals( CALCULAR_ANTIGUEDAD ) )
{
principal.calcularAntiguedadEmpleado( );
}
else if( command.equals( CALCULAR_PRESTACIONES ) )
{
principal.calcularPrestacionesEmpleado( );
}
}
}Se analiza cuál fue el evento que ocurrió
Se llaman métodos de la ventana principal
Cada vez que el usuario hace click en un botón del panel, se ejecuta el método actionPerformed
Decir que el panel es el encargado de atender el evento
Mediante el método addActionListener de la clase JButton. Se le pasa como parámetro del método el objeto que lo está ejecutando, es decir el panel mismo
public PanelConsultas( InterfazEmpleado pPrincipal )
{
...
btnEdad = new JButton( );
btnEdad.setText( "Calcular edad" );
btnEdad.setActionCommand( PanelConsultas.CALCULAR_EDAD );
btnEdad.addActionListener( this );
btnAntiguedad = new JButton( );
btnAntiguedad.setText( "Calcular antigüedad" );
btnAntiguedad.setActionCommand( PanelConsultas.CALCULAR_ANTIGUEDAD );
btnAntiguedad.addActionListener( this );
btnPrestaciones = new JButton( );
btnPrestaciones.setText( "Calcular prestaciones" );
btnPrestaciones.setActionCommand( PanelConsultas.CALCULAR_PRESTACIONES );
btnPrestaciones.addActionListener( this );
}Su función: crear una instancia de la ventana y hacerla visible en la pantalla
public static void main( String[] args ) {
InterfazEmpleado interfaz = new InterfazEmpleado( );
interfaz.setVisible( true );
}La interfaz
En el método constructor de la ventana principal
public InterfazEmpleado( )
{
setTitle( "Sistema de un empleado" );
setSize( 600, 580 );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
// Construir el empleado
empleado = new Empleado( );
...
}
Los requerimientos funcionales se implementan en la ventana principal:
Si se pidió una modificación, se llaman los métodos que retornan los nuevos valores que se deben desplegar
Pide a todos los paneles que tienen información que pudo haber cambiado, que actualicen sus valores (REFRESCO)
try
{
int nCantidad = Integer.parseInt ( strCantidad );
}
catch (NumberFormatException e)
{
// Mensaje al usuario
}La clase String de Java provee métodos para transformar la cadena de caracteres tecledada por el usuario (y en general cualquier cadena de caracteres):