Graficos y Datos

68
4.1. Interfaz gráfica / cuadros de entrada y salida. Los cuadros de diálogo son ventanas en las cuales las aplicaciones pueden capturar información o visualizar mensajes que deben ser leídos por el usuario. La clase JOptionPane ofrece un conjunto de métodos para la utilización de cuadros de entrada (InputDialog) ó cuadros de mensaje (MessageDialog). import javax.swing.JOptionPane; //importamos la clase JOptionPane. public class Mensaje { public static void main (String args[ ]) { String nombre = JOptionPane.showInputDialog(“Ingresa tu nombre:”); JOptionPane.showMessageDialog(null, “Bienvenido “ + nombre, “Bienvenida”, JOptionPane.PLAIN_MESSAGE); } }

description

Graficos y Datos Oracle.

Transcript of Graficos y Datos

  • 4.1. Interfaz grfica / cuadros de entrada y salida.

    Los cuadros de dilogo son ventanas en las cuales las aplicaciones pueden capturar informacin o visualizar mensajes que deben ser ledos por el usuario. La clase JOptionPane ofrece un conjunto de mtodos para la utilizacin

    de cuadros de entrada (InputDialog) cuadros de mensaje (MessageDialog).

    import javax.swing.JOptionPane; //importamos la clase JOptionPane. public class Mensaje { public static void main (String args[ ]) { String nombre = JOptionPane.showInputDialog(Ingresa tu nombre:);

    JOptionPane.showMessageDialog(null, Bienvenido + nombre, Bienvenida, JOptionPane.PLAIN_MESSAGE);

    } }

  • 4.1. Interfaz grfica / cuadros de entrada y salida.

    Los cuadros de dilogo son ventanas en las cuales las aplicaciones pueden capturar informacin o visualizar mensajes que deben ser ledos por el usuario. La clase JOptionPane ofrece un conjunto de mtodos para la utilizacin

    de cuadros de entrada (InputDialog) cuadros de mensaje (MessageDialog).

    import javax.swing.JOptionPane; //importamos la clase JOptionPane. public class Mensaje { public static void main (String args[ ]) { String nombre = JOptionPane.showInputDialog(Ingresa tu nombre:);

    JOptionPane.showMessageDialog(null, Bienvenido + nombre, Bienvenida, JOptionPane.PLAIN_MESSAGE);

    } }

  • 4.1. Interfaz grfica / cuadros de entrada y salida.

    showMessageDialog(null, Bienvenido + nombre, Bienvenida, JOptionPane.PLAIN_MESSAGE);

    El primer argumento representa la posicin en la que aparecer el cuadro de mensaje; el valor null indica que utilizar como referencia el monitor de la computadora. El segundo argumento representa el mensaje a visualizar. El tercer argumento representa el ttulo del cuadro de mensaje. El cuarto mensaje hace referencia al tipo de mensaje a visualizar.

  • 4.2. Componentes Swing.

    Antes de la aparicin de Swing, los componentes grficos utilizados pertenecan a la Abstract Window Toolkit (AWT), por lo que cuando una aplicacin java que utilizaba componentes AWT era ejecutada bajo un sistema operativo distinto, los componentes grficos aparecan de manera diferente. Actualmente, los componentes grficos Swing definen su apariencia

    gracias a lo que conocemos como look-and-feel; lo que significa que los componentes Swing permiten definir una presentacin uniforme sobre cualquier plataforma donde se ejecute la aplicacin.

  • 4.2.1. JLabel. import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.Icon; import javax.swing.ImageIcon; public class MiVentana extends JFrame { private JLabel etiqueta1; private JLabel etiqueta2; public MiVentana( ) { super(Etiquetas); setLayout(new FlowLayout()); //etiqueta con una lnea de texto.

    etiqueta1 = new JLabel(Etiqueta con texto); etiqueta1.setToolTipText(Esta es una etiqueta); add(etiqueta1); //etiqueta con imagen. Icon logo = new ImageIcon(getClass( ).getResource(abit.gif));

    etiqueta2 = new JLabel (Etiqueta con texto e imagen, logo, SwingConstants.LEFT); etiqueta2.setToolTipText(Esta es una etiqueta2); add(etiqueta2);

    } }

  • 4.2.2. JTextField. import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JPasswordField; public class MiVentana extends JFrame { private JTextField texto1; private JPasswordField texto2; private JLabel etiqueta1, etiqueta2; public MiVentana( ) { super(Cajas de Texto); setLayout(new FlowLayout()); etiqueta1 = new JLabel(Ingresar texto:); add(etiqueta1); texto1 = new JTextField(10); add(texto1); etiqueta2 = new JLabel(Ingresar password:); add(etiqueta2); texto2 = new JPasswordField(texto oculto); add(texto2); } }

  • 4.2.2.1. Gestin de eventos.

    Cada uno de los componentes utilizados genera un evento, en especial la caja de texto; por ejemplo: si al momento de terminar de escribir algn tipo de informacin, presionamos la tecla Enter, qu ha pasado? Ha sucedido lo mismo que debera suceder si hacemos click sobre

    cualquier botn. Se ha generado un evento. Todos los componentes java generan eventos que le dicen al programador que se est interactuando con este tipo de componente java, el problema es que dichos eventos no son capturados porque lo no podemos saber en este momento qu componente est siendo utilizado.

  • 4.2.2.1. Gestin de eventos.

    El modelo que representa la gestin de eventos en java est conformado por tres partes, a saber: - El generador del evento: representado por el objeto grfico java con el que el

    usuario interacta. - El evento: objeto que contiene informacin sobre el evento ocurrido. - El oyente de eventos: encargado de recibir el evento y de responder.

    Boton1

    Boton2

    Caja de Texto

    Ventana

    Oyente1

    Oyente2

  • 4.2.2.1. Gestin de eventos.

    ActionListener: El usuario pulsa un botn, presiona enter en una caja de texto elige algn tem de un men. WindowListener: El usuario elige un JFrame, lo cierra, etc. MouseMotionListener: El usuario pasa el puntero del mouse sobre algn

    componente.

  • 4.2.2.1. Gestin de eventos.

    Un oyente de eventos es una clase java cualquiera que implementa cualquiera de las interfaces mencionadas anteriormente (ActionListener, WindowListener, MouseMotionListener, etc. ). Por ejemplo, la interface ActionListener, posee el siguiente mtodo:

    - actionPerformed(ActionEvent e): Cada vez que presionamos un botn o enter en una caja de texto, este mtodo es lanzado. El objeto ActionEvent, ofrece informacin sobre el objeto que origin el evento.

  • 4.2.2.1. Gestin de eventos Ejemplo(1) import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MiAplicacion extends JFrame implements ActionListener { private JTextField cajaTexto1, cajaTexto2, cajaTexto3; public MiAplicacion() { super(Gestionando eventos); setLayout(new FlowLayout()); cajaTexto1 = new JTextField(10); cajaTexto1.addActionListener(this); add(cajaTexto1); cajaTexto2 = new JTextField(Ingresar Texto ); cajaTexto2.addActionListener(this); add(cajaTexto2); cajaTexto3 = new JTextField(Texto no editable, 21); cajaTexto3.setEditable(false); cajaTexto3.addActionListener(this); add(cajaTexto3); }

  • 4.2.2.1. Gestin de eventos Ejemplo(2)

    public void actionPerformed(ActionEvent e) { String cadena = ; if (e.getSource().equals(cajaTexto1)) cadena = Texto 1: + e.getActionCommand(); else if (e.getSource().equals(cajaTexto2)) cadena = Texto 2: + e.getActionCommand(); else if (e.getSource().equals(cajaTexto3)) cadena = Texto 3: + e.getActionCommand(); JOptionPane.showMessageDialog(null,cadena); } }

  • 4.2.3. JButton import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MiAplicacion extends JFrame implements ActionListener { private JButton boton1, boton2; public MiAplicacion() { super(Usando botones); setLayout(new FlowLayout()); boton1 = new JButton(Primer boton); boton1.addActionListener(this); add(boton1); Icon icono1 = new ImageIcon(getClass().getResource(icono.gif)); boton2 = new JButton(Segundo boton, icono1); boton2.addActionListener(this); add(boton2); } public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(this, Presionaste: + e.getActionCommand()); } }

  • 4.3. Clases Adaptadoras.

    La implementacin del oyente de eventos ActionListener hasta el momento no ha sido una tarea complicada. Eventos relacionados con el manejo del mouse, teclado ventanas.

    WindowListener, MouseListener o MouseMotionListener. WindowsListener:

    - windowActivated(WindowEvent e) - windowClosed(WindowEvent e) - windowClosing(WindowEvent e) - windowDeactivated(WindowEvent e) - windowDeiconified(WindowEvent e) - windowIconified(WindowEvent e) - windowOpened(WindowEvent e)

  • 4.3. Clases Adaptadoras.

    Clase Adaptadora Interface que implementa

    ComponentAdapter ComponentListener

    ContainerAdapter ContainerListener

    FocusAdapter FocusListener

    KeyAdapter KeyListener

    MouseAdapter MouseListener

    MouseMotionAdapter MouseMotionListener

    WindowAdapter WindowListener

  • 4.3. Clases Adaptadoras.

    import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MiAplicacion extends JFrame { public MiAplicacion() { super(Manejo de eventos); addWindowListener(new VentanaEvento()); } //Clase interna Clase Adaptadora. private class VentanaEvento extends WindowAdapter { public void windowIconified(WindowEvent e) {

    JOptionPane.showMessageDialog(null, Ventana Minimizada);

    } } }

  • 4.4. Contenedores.

    El primer contenedor que hemos utilizado hasta el momento es el propio JFrame, quien ha tenido la labor de contener botones, cajas de texto, etiquetas, etc. En las versiones anteriores de java, no era posible insertar directamente un componente gui en el contenedor JFrame sino a travs de su Container (mtodo getContentPane()), por lo que actualmente al usar el mtodo add(componente), directamente estamos insertando sobre el Container del JFrame. Entre los contenedores ms utilizados para la construccin de aplicaciones en

    java tenemos: JPanel, JInternalFrame, JFrame, etc.

  • 4.5. Distribuidores de Componentes.

    Posicin Absoluta: Esta forma especifica que al no definir un distribuidor de componentes para un determinado contenedor (setLayout(null)) se debe proceder a definir la posicin exacta del componente. Esta forma de establecer su posicin es bastante tediosa a no ser que se posea un entorno de desarrollo (NetBeans). Distribuidores de Componentes: Usando los distribuidores de componentes dejamos en

    ellos la responsabilidad para definir la ubicacin y tamao de los componentes, la desventaja radica en que perdemos el control sobre tamao y ubicacin de los componentes.

    Programacin Visual en algn IDE: Los entornos de desarrollo (IDE), permiten que el

    programador simplemente arrastre el componente sobre el contenedor. El IDE genera el cdigo java correspondiente dependiendo de los componentes utilizados.

  • 4.5. Distribuidores de Componentes.

    Distribuidor Descripcin

    FlowLayout Distribuidor por defecto para los JPanel. Distribuye los componentes secuencialmente (izquierda a derecha) en el orden en que son aadidos.

    BorderLayout Distribuidor por defecto para los JFrames. Distribuye los componentes en cinco reas: Norte, Sur, Este, Oeste y Centro.

    GridLayout Distribuye los componentes en filas y columnas.

  • 4.5.1. FlowLayout BorderLayout GridLayout.

  • 4.5.2. Paneles.

    Mi Primera Aplicacin Java

    Cdigo:

    Apellidos:

    Nombres:

    Nuevo Modificar Salir

  • 4.5.2. Paneles.

    Mi Primera Aplicacin Java

    Cdigo:

    Apellidos:

    Nombres:

    Nuevo Modificar Salir

    JFrame (podramos asignarle un distribuidor BorderLayout)

    Podemos insertar el titulo (JLabel) sobre el JFrame y ubicarlo en la posicin NORTH

    JPanel insertado en la posicin CENTER, a su vez tiene un distribuidor GridLayout (3 filas, 2 columnas). Contiene las tres etiquetas y las tres cajas de texto.

    JPanel insertado en la posicin SOUTH, a su vez tiene un distribuidor FlowLayout para distribuir los botones de manera horizontal.

    Cdigo:

    Apellidos:

    Nombres:

    Nuevo Modificar Salir

  • 5. Gestin de errores.

    La construccin de cualquier aplicacin informtica conlleva por naturaleza a tener que estar preparados para el momento en que aparezcan errores durante la ejecucin de la misma. Java ofrece una manera de gestionar estos errores con la finalidad de evitar la interrupcin total de la aplicacin. Es necesario tener en cuenta que el uso normal que cualquier usuario da a una aplicacin

    implica tpicamente el ingreso de datos incorrectos, los cuales, sin ningn control por parte de la aplicacin podran afectar a la misma; es por eso que nuestras aplicaciones se encuentran en la obligacin de implementar un control de errores logrando as de esta manera dirigir al usuario mientras usa la herramienta.

  • 5.1. Excepciones.

    Una excepcin indica que ha ocurrido un problema durante la ejecucin de la aplicacin. Representa una anomala al funcionamiento normal de la aplicacin. La gestin de las excepciones en java permite a los programadores definir un conjunto de reglas que resuelvan estos problemas al momento de su aparicin.

    import java.util.Scanner; public class Calculadora { public static int division(int n, int d) { return n / d; } public static void main (String args[]) { Scanner sc = new Scanner(System.in); System.out.println(Ingrese numerador: ); int num = sc.nextInt(); System.out.println(Ingrese denominador: ); int denom = sc.nextInt(); int resultado = division(num, denom); System.out.println(resultado : + resultado ); } }

  • 5.1. Excepciones.

    Excepcin Descripcin

    ArrayIndexOutOfBoundsException Se accede a una posicin del arreglo que no existe.

    ArithmeticException Una excepcin aritmtica ha ocurrido. Divisin por cero.

    ClassNotFoundException La clase instanciada no ha sido encontrada.

    NullPointerException Se espera un objeto y se recibe un valor null; la longitud del arreglo esperado es null.

    NumberFormatException Se introducen caracteres no numricos.

  • 5.1. Excepciones.

    try { //sentencias

    //Pueden generar una excepcin} catch (TipodeExcepcion ex1) {

    //sentencias que se ejecutarn cuando se produzca una excepcin del tipo TipodeExcepcion.

    } catch (OtroTipodeExcepcion ex2) {

    //sentencias que se ejecutarn cuando se produzca una excepcin del tipo OtroTipodeExcepcion.

    } finally { //sentencias //Se ejecutan siempre. }

  • 5.1.1. Clasula throws.

    public void metodo1( ) { B obj = new B(); obj.metodo2(); }

    clase A

    public void metodo2( ) throws ArithmeticException { int a = 5 / 0; }

    clase B

    Creamos una instancia de B y llamamos a metodo2.

  • 5.1.1. Clasula throws.

    import java.util.Scanner; public class Calculadora {

    //mtodo division informa que no controlar la excepcin, slo la reenviar. public static int division(int n, int d) throws ArithmeticException { return n / d; }

  • 5.1.1. Clasula throws. public static void main (String args[ ]) { Scanner sc = new Scanner(System.in); boolean continuar = true; do { try { System.out.println(Ingrese numerador: ); int num = sc.nextInt(); System.out.println(Ingrese denominador: ); int denom = sc.nextInt(); int resultado = division(num, denom); System.out.println(resultado : + resultado ); continuar = false; } //en caso aparezca la excepcin InputMismatchException catch (InputMismatchException ex1) { System.out.println(Excepcion: + ex1); sc.nextLine(); System.out.println(Ingresar numeros. Intente de nuevo); } //en caso aparezca la excepcin ArithmeticException catch(ArithmeticExcepcion ex2) { System.out.println(Excepcion: + ex2); System.out.println(Division por cero. Intente de nuevo);

    } }while(continuar); } }

  • 5.1.2. Clasula throw

    Existen situaciones en las que necesitamos forzar el lanzamiento de una excepcin para indicar que una aplicacin no se ajusta a ciertas reglas particulares; para ello podemos utilizar la clasula throw.

    public class Empleado { private String nombre; private int sueldo; public void setNombre(String nomVal) { nombre = nomVal; } public void setSueldo(int suelVal) throws Exception { if(suelVal>3000) { throw new Exception("Limite superado"); } else {

    sueldo = suelVal; } } }

  • 5.1.3. Ejemplo

    public class Empleado { private String nombre; private int sueldo; public void setNombre(String nomVal) { nombre = nomVal; } public void setSueldo(int suelVal) throws Exception { if(suelVal>3000) { throw new Exception("Limite superado"); } else { sueldo = suelVal; } } }

  • 5.1.3. Ejemplo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MiAplicacion extends JFrame implements ActionListener { private JTextField txtNombre, txtSueldo, txtSueldoNeto; private double sueldo, sueldoNeto; public MiAplicacion() { super( "Demostrando Excepciones" ); setLayout( new GridLayout( 3, 2 ) ); add(new JLabel( "Nombre: ", SwingConstants.RIGHT ) ); txtNombre = new JTextField(); add( txtNombre ); add( new JLabel( "Sueldo (presionar Enter):", SwingConstants.RIGHT ) ); txtSueldo = new JTextField(); add( txtSueldo ); txtSueldo.addActionListener( this );

  • 5.1.3. Ejemplo add( new JLabel( "Sueldo Neto: ", SwingConstants.RIGHT ) ); txtSueldoNeto = new JTextField(); add( txtSueldoNeto ); } public void actionPerformed( ActionEvent e ) { txtSueldoNeto.setText( "" ); try { //Esta linea puede generar una excepcion. sueldo = Double.parseDouble( txtSueldo.getText() ); Empleado emp = new Empleado(); emp.setNombre(txtNombre.getText()); //Esta linea puede generar una excepcion. emp.setSueldo(sueldo); sueldoNeto = calcular(sueldo); txtSueldoNeto.setText( String.valueOf( sueldoNeto ) ); }

  • 5.1.3. Ejemplo

    catch ( NumberFormatException nfex ) { JOptionPane.showMessageDialog( this, "Se debe ingresar un entero", "Formato invalido", JOptionPane.ERROR_MESSAGE ); } catch ( Exception ex ) { JOptionPane.showMessageDialog( this, ex.getMessage(), "Excepcion de la clase Empleado", JOptionPane.ERROR_MESSAGE ); } } public double calcular( double numero ) { double impuesto = numero * 0.19; return numero - impuesto; } }

  • 5.1.3. Ejemplo

  • 5.1.4. JFrames Java Beans.

    Registro de Alumnos

    Cdigo:

    Apellidos:

    Nombres:

    Guardar Modificar Salir

    codigo; apellidos; nombres;

    Alumno

    setCodigo(); getCodigo(); setApellidos(); getApellidos(); setNombres(); getNombres();

    JavaBean

  • 6. JDBC Java Database Connectivity

    Modelo Relacional.

    Number Name Department Salary Location

    23603 Jones 413 1100 New Jersey

    24568 Kerwin 413 2000 New Jersey

    34589 Larson 642 1800 Los Angeles

    35761 Myers 611 1400 Orlando

    47132 Neumann 413 9000 New Jersey

    78321 Stephens 611 8500 Orlando

    Row

    Column Primary key

  • 6.1. SQL lenguaje de consulta.

    Instruccin Descripcin

    SELECT Selecciona uno o ms campos de una o varias tablas.

    FROM Selecciona las tablas envueltas en la consulta.

    WHERE Condicin para la seleccin.

    ORDER BY Ordena los resultados de manera ascendente o descendente.

    INSERT Inserta registros en una tabla.

    UPDATE Actualiza registros en una tabla.

    DELETE Eliminar registros en una tabla.

  • 6.1. SQL lenguaje de consulta.

    SELECT * FROM Empleados

    SELECT Name, Department, Salary FROM Empleados WHERE Salary > 3000

    SELECT Name, Department, Salary FROM Empleados WHERE Name LIKE L%

    INSERT INTO Empleados (Number, Name, Department, Salary, Location) VALUES (67897, Pedro, 115, 5678, Per)

    UPDATE Empleados SET Name = Juan WHERE Name = Pedro

    DELETE FROM Empleados WHERE Salary > 3000

  • 6.2. JTable import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MiAplicacion extends JFrame { public MiAplicacion() { Object[][] registros = { {"Carlos", "Martinez", "Natacion", 5, false}, {"Pedro", "Ortega", "Tenis",3, true}, {"Juan", "Garcia", "Ajedrez",2, false}, {"Luis", "Perez", "Futbol", 5, true} };

    String[] columnas = {"Nombre", "Apellidos", "Deporte", "# de Anios", "Vegetariano"}; JTable tabla = new JTable(registros, columnas); JScrollPane panel = new JScrollPane(tabla); add(panel, BorderLayout.CENTER); } }

  • 6.3. Orgenes de datos.

    A partir de este momento nuestra aplicacin java tendr la necesidad de almacenar o recuperar datos desde una base de datos relacional; por lo que se har necesario definir en la aplicacin cierta informacin que ayude a nuestra clase java a encontrar la base de datos deseada, la tabla deseada para poder insertar, actualizar, eliminar o recuperar informacin. Un origen de datos, define cierta informacin que ser utilizada por

    nuestra aplicacin java para poder establecer conexin con la base de datos deseada. JDBC en este punto, representa un marco de programacin utilizado por

    los programadores con la finalidad de conectar una aplicacin java con ciertas bases de datos sin importar el software que la gestiona.

  • 6.3. Orgenes de datos.

  • 6.3. Orgenes de datos.

    clase Connection: Es la clase encargada de gestionar la conexin hacia la base de datos. clase Statement: Es aquella clase encargada de definir la consulta SQL

    a ejecutar. clase ResultSet: Es aquella clase encargada de gestionar el resultado

    obtenido producto de la ejecucin de una consulta.

  • 6.3. Orgenes de datos. import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.*; import java.util.*; public class MiAplicacion extends JFrame { private Connection cn; private Statement st; private ResultSet rs; private JTable tabla; public MiAplicacion() { super(Accediendo a una base de datos); String url = "jdbc:odbc:DsnAcademico";

  • 6.3. Orgenes de datos. //carga del driver JDBC ODBC y apertura de la conexin try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); cn = DriverManager.getConnection(url); } catch (ClassNotFoundException cnfex) { System.exit(1); //termina el programa } catch (SQLException sqlex) { System.exit(1); } Vector cabecera = new Vector(); Vector filas = new Vector();

  • 6.3. Orgenes de datos. try { st = cn.createStatement(); rs = st.executeQuery("SELECT * FROM Alumno"); rs.next(); //obteniendo la cabecera de la tabla. ResultSetMetaData rsmd = rs.getMetaData(); for (int i = 1; i
  • 6.3. Orgenes de datos. tabla = new JTable(filas, cabecera); JScrollPane panel = new JScrollPane(tabla); add(panel, BorderLayout.CENTER); } catch (SQLException sqlex) { sqlex.printStackTrace(); } }

  • 6.3. Orgenes de datos analizando.

    JTable (Object[ ][ ] datos, Object[ ] columnas) JTable (Vector datos, Vector columnas) Ventaja: facilidad de uso. Desventajas:

    - Cada celda automticamente se encuentra en estado editable. - Todos los datos visualizados son tratados con el mismo tipo (String). - La obligacin de utilizar arreglos o vectores para almacenar datos. Esto puede

    ser una desventaja, por ejemplo si obtenemos un conjunto de objetos provenientes de una base de datos, no podremos trabajar con ellos directamente sino es a travs de un vector un arreglo bidimensional.

  • 6.4. Modelo de datos ModelTable.

    Cada JTable utilizado en nuestros ejemplos est basado en un modelo de datos que tiene como finalidad gestionar los datos visualizados en la tabla. Hasta el momento, en los ejemplos anteriores al no crear un modelo de datos propio, la clase JTable al momento de ser instanciada automticamente crea un modelo de datos por defecto (DefaultTableModel). La utilizacin de un modelo de datos permitir a los programadores

    agregar, modificar, eliminar todo dato visualizado en la tabla; por lo tanto, cualquier operacin que realicemos con el modelo de datos implicar automticamente un cambio en el objeto JTable.

  • 6.4. Modelo de datos ModelTable.

    Modelo de Datos Base de Datos

  • 6.4. Modelo de datos ModelTable. public class Persona { private String codigo = null; private String nombre = null; private String apellido = null; private int edad = 0; public Persona(String codigo, String nombre, String apellido, int edad) { this.codigo = codigo; this.nombre = nombre; this.apellido = apellido; this.edad = edad; } public String getCodigo() { return codigo; } public String getNombre() { return nombre; } public String getApellido() { return apellido; } public int getEdad() { return edad; } public void setCodigo (String codigo) { this.codigo = codigo; } public void setNombre (String nombre) { this.nombre = nombre; } public void setApellido (String apellido ) { this.apellido = apellido; } public void setEdad (int edad) {this.edad = edad;} }

    JavaBean

  • 6.4. Modelo de datos ModelTable.

    Para la implementacin del modelo propio, tenemos inicialmente dos opciones: implementar la interface TableModel e implementar todos sus mtodos extender la clase abstracta AbstractTableModel. - int getColumnCount(): mtodo que debe devolver el nmero de columnas que

    posee la tabla. - int getRowCount(): mtodo que debe devolver el nmero de registros

    existentes en la tabla. - Object getValueAt(int rowIndex, int columnIndex): mtodo que debe retornar

    el valor de una celda habiendo especificado previamente su fila y columna.

  • 6.4. Modelo de datos ModelTable. import javax.swing.table.*; import javax.swing.event.*; import java.util.*; public class MiModelo extends AbstractTableModel { private LinkedList datos = new LinkedList(); private LinkedList listeners = new LinkedList(); public int getColumnCount() { return 4; } public int getRowCount() { return datos.size(); } public String getColumnName(int columnIndex) { switch (columnIndex) { case 0: return "Codigo"; case 1: return "Nombres"; case 2: return "Apellidos"; case 3: return "Edad"; default: return null; } }

    Modelo de Datos

  • 6.4. Modelo de datos ModelTable.

    public Object getValueAt(int rowIndex, int columnIndex) { Persona aux; aux = (Persona)(datos.get(rowIndex)); switch (columnIndex) { case 0: return aux.getCodigo(); case 1: return aux.getNombre(); case 2: return aux.getApellido(); case 3: return new Integer(aux.getEdad()); default: return null; } }

    Modelo de Datos

  • 6.4. Modelo de datos ModelTable. public void setValueAt(Object aValue, int rowIndex, int columnIndex) { Persona aux = (Persona)(datos.get(rowIndex)); switch (columnIndex) { case 0: aux.setCodigo ((String)aValue); break; case 1: aux.setNombre ((String)aValue); break; case 2: aux.setApellido ((String)aValue); break; case 3: aux.setEdad (Integer.parseInt((String)aValue)); break; default: break; } TableModelEvent evento = new TableModelEvent (this, rowIndex, rowIndex, columnIndex); avisaSuscriptores (evento); } public void eliminaPersona (int fila) { datos.remove(fila); TableModelEvent evento = new TableModelEvent (this, fila, fila, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE); avisaSuscriptores (evento); }

    Modelo de Datos

  • 6.4. Modelo de datos ModelTable. public void insertaPersona (Persona nuevaPersona) { datos.add (nuevaPersona); TableModelEvent evento; evento = new TableModelEvent (this, this.getRowCount()-1, this.getRowCount()-1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT); avisaSuscriptores (evento); } public void addTableModelListener(TableModelListener l) { listeners.add (l); } public void removeTableModelListener(TableModelListener l) { listeners.remove(l); } private void avisaSuscriptores (TableModelEvent evento) { int i; for (i=0; i
  • 6.4. Modelo de datos ModelTable. public class GestionTabla { private MiModelo modelo = null; private static int numero = 0; public GestionTabla(MiModelo modelo) { this.modelo = modelo; modelo.insertaPersona(new Persona ("001", "Juan", "Perez", 38)); modelo.insertaPersona(new Persona ("002", "Mara", "Garca", 24)); modelo.insertaPersona(new Persona ("003", "Luis", "Rivera", 15)); modelo.insertaPersona(new Persona ("004", "Pedro", "Chavez", 48)); } public void insertaFila () { Persona dato = new Persona ( "Codigo " + Integer.toString(numero), "Nombre " + Integer.toString (numero), "Apellido " + Integer.toString (numero), numero); modelo.insertaPersona (dato); numero++; } //Elimina la primera persona de la tabla. public void borraFila () { if (modelo.getRowCount() > 0) modelo.eliminaPersona(0); } }

    GestionTabla

  • 6.4. Modelo de datos ModelTable. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MiAplicacion extends JFrame implements ActionListener { GestionTabla control; JButton botonInserta, botonElimina; public MiAplicacion() { super(Utilizando modelo de datos); setLayout(null); MiModelo modelo = new MiModelo(); control = new GestionTabla (modelo); JTable tabla = new JTable (modelo); JScrollPane panel = new JScrollPane(tabla); botonInserta = new JButton ("Insertar"); botonInserta.addActionListener(this); botonElimina = new JButton ("Eliminar"); botonElimina.addActionListener(this); panel.setBounds(50, 70, 500, 300); botonInserta.setBounds(50, 400, 100, 25); botonElimina.setBounds(160, 400, 100, 25); add(panel); add(botonInserta); add(botonElimina); }

    Interfaz Grfica

  • 6.4. Modelo de datos ModelTable. public void actionPerformed(ActionEvent e) { if (e.getSource().equals(botonInserta)) { control.insertaFila(); } else { control.borraFila(); } } }

    Interfaz Grfica

  • 6.4. Modelo de datos ModelTable.

    JFrame + JTable

    Modelo de Datos

    Gestion Tabla Inserta una filaElimina una fila

    Inserta una fila Elimina una fila

    Modifica una celda. Recupera el valor de una celda. Recupera nombre de columna.

    setValueAt getColumnCount getColumnName getRowCount .

  • 7.1. Modelo Vista Controlador

    La arquitectura Modelo Vista Controlador (MVC) separa la aplicacin en tres partes que toman exactamente las mismas palabras (Modelo, Vista, Controlador). El objetivo principal de la mencionada arquitectura: Separar la interfaz de usuario de los datos. - Modelo: El modelo es la capa que permite gestionar los datos de la aplicacin. El modelo

    es el responsable del almacenamiento y recuperacin del objeto. - Vista: Representa la interfaz de usuario. En otras palabras, la vista puede ser concebida

    como la interfaz grfica del modelo. Es posible asociar ms de una vista a un modelo. - Controlador: Es el encargo de implementar la lgica para el procesamiento de las

    entradas de usuario. Encargado de integrar la aplicacin. Una vez que la vista notifica al controlador que se ha originado una entrada de usuario, el controlador notifica al modelo que los datos han cambiado, y por ltimo el modelo notifica a todas las vistas registradas que procedan a su actualizacin.

  • 7.1. Modelo Vista Controlador

    Modelo

    Vista(s) Controlador

    Notifica

    Evento

    Actualiza

  • 7.2. Patrn Observador - Observable

    Un Observer es cualquier objeto que necesita recibir notificaciones sobre el estado de otros objetos, mientras que un Observable posee ciertos mtodos que permitan cambiar los datos y notificar a todos los Observer registrados al mismo.

    Valor Observable

    Vista 1

    Vista 2

    Cambia

    Cambia

    Notifica

  • 7.2. Patrn Observador - Observable import java.util.Observable; public class ValorObservable extends Observable { private int nValor = 0; private int nInferior = 0; private int nSuperior = 0; public ValorObservable( int nValor,int nInferior,int nSuperior ) { this.nValor = nValor; this.nInferior = nInferior; this.nSuperior = nSuperior; } public void setValor(int nValor) { this.nValor = nValor; setChanged(); notifyObservers(); } public int getValor() { return( nValor ); } public int getLimiteInferior() { return( nInferior ); } public int getLimiteSuperior() { return( nSuperior ); } }

  • 7.2. Patrn Observador - Observable import java.awt.*; import java.util.*; import javax.swing.*; import java.awt.event.*; public class TextoObservador extends JFrame implements ActionListener, Observer { private ValorObservable vo; private TextField tf1; private JLabel lbl1; private int nInferior = 0; private int nSuperior = 0; public TextoObservador( ValorObservable vo ) { super("Observador de Texto"); this.vo = vo; setLayout( new GridLayout( 0,1 ) ); nInferior = vo.getLimiteInferior(); nSuperior = vo.getLimiteSuperior(); tf1 = new TextField( String.valueOf( vo.getValor() ) ); tf1.addActionListener(this); add( tf1 ); lbl1 = new JLabel(); add( lbl1 ); }

  • 7.2. Patrn Observador - Observable public void actionPerformed (ActionEvent e) { if (e.getSource().equals(tf1)) { int n = 0; boolean bValido = false; try { n = Integer.parseInt( tf1.getText() ); bValido = true; } catch( NumberFormatException nfe ) { bValido = false; } // Comprobamos que no se sobrepasen los lmites que hemos fijado if( n < nInferior || n > nSuperior ) bValido = false; if( bValido ) { vo.setValor( n ); lbl1.setText( "" ); } else lbl1.setText( "Valor no valido - intentelo de nuevo" ); } } public void update( Observable obs,Object obj ) { if( obs == vo ) tf1.setText( String.valueOf( vo.getValor() ) ); } }

  • 7.2. Patrn Observador - Observable import java.awt.*; import java.util.*; import javax.swing.*; import java.awt.event.*; public class BarraObservador extends JFrame implements Observer, AdjustmentListener { private ValorObservable vo = null; private JScrollBar sb = null; public BarraObservador( ValorObservable vo ) { super( "Observador de Barra" ); this.vo = vo; setLayout( new GridLayout( 0,1 ) ); sb = new JScrollBar(Scrollbar.HORIZONTAL, vo.getValor(), 10, vo.getLimiteInferior(), vo.getLimiteSuperior()); sb.addAdjustmentListener(this); add(sb); } public void adjustmentValueChanged( AdjustmentEvent e ) { if (e.getSource().equals(sb)){ vo.setValor( sb.getValue() ); } } public void update( Observable obs,Object obj ) { if( obs == vo ) sb.setValue( vo.getValor() ); } }

  • 7.2. Patrn Observador - Observable import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Principal { public static void main( String args[] ) { ValorObservable vo = new ValorObservable( 100,0,500 ); TextoObservador to = new TextoObservador( vo ); to.pack(); to.setVisible(true); BarraObservador bo = new BarraObservador( vo ); bo.pack(); bo.setVisible(true); vo.addObserver( to ); vo.addObserver( bo ); } }