Clases Asociadas y encapsulamiento

Slides:



Advertisements
Presentaciones similares
Reusabilidad La productividad está basada en reusabilidad y extensibilidad El reusabilidad permite desarrollar nuevas aplicaciones a partir de componentes.
Advertisements

El proceso de desarrollo de software
Encapsulamiento y Abstracción
Abstracción de Datos La abstracción es un recurso fundamental en la programación orientada a objetos y está además fuertemente ligado a reusabilidad.
Genericidad Los datos de aplicaciones muy diferentes puede modelarse con frecuencia a partir de tipos de datos cuyas operaciones no dependen del tipo de.
TEMA 1. Diseño de interfaces gráficas
Programación “Conducida por eventos” Event-driven programming Agustín J. González ELO330.
Aplicaciones GUI en Java
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
Interfaces Graficas Profesor: Rodrigo Cruzat. Contenedores La ventana misma, que contiene botones, texto, etc… y donde se realizará la interacción JFrame.
1 Programación “Conducida por eventos” Event-driven programming Agustín J. González ELO329/ELO330.
Presentado por: PABLO ANDRES DIAZ SAIN HASSAM CAICEDO
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
1 Programación “Conducida por eventos” Event-driven programming Agustín J. González ELO329/ELO330.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
Entorno Gráfico Desacoplar Eventos. Jframe setResizable setTitle setSize setVisible Jpanel Layout GridBack SetBounds Jlabel Jbuttom Jchechbox Jradio.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Exception Object Throwable Error Exception Runtime Exception.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Sonia Rueda Herencia y Polimorfismo
Interfaces Gráficas de Usuario
Interfaces Gráficas de Usuario
Interfaces Gráficas de Usuario
IPOO 2 cuatrimestre 2016 Departamento de Ciencias e Ingeniería
INSTITUTO TECNOLÓGICO SUPEROR DE LIBRES INGENIERÍA EN SISTEMAS COMPUTACIONALES TÓPICOS AVANZADOS ING.ELIZABETH DIAZ OREA 4° SEMESTRE INTEGRANTES: ESMERALDA.
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
Componentes básicos ComponenteDescripción JLabel  Permite agregar texto no editable, o incluso imágenes. JTextField  Permite al usuario ingresar texto.
Interfaces Gráficas de Usuario
Interfaces Gráficas de Usuario
Clases Asociadas y encapsulamiento
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
Clases Asociadas y encapsulamiento
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Transcripción de la presentación:

Clases Asociadas y encapsulamiento En el diseño de una aplicación, la solución se modula de modo tal que cada clase pueda implementarse sin depender de las demás. En el desarrollo de una aplicación en la cual la entrada y salida se realiza a través de una GUI, la clase que implementa la interface gráfica de usuario usa a las clases que modelan el problema, sin conocer detalles de la representación. Análogamente, las clases que modelan el problema se diseñan e implementan si saber si la entrada y salida va a hacerse por consola o mediante una GUI.

Traductor Español a Inglés Caso de Estudio: Traductor Español a Inglés Implemente una GUI que permita traducir una palabra de Español a Inglés. El usuario ingresa la palabra en la caja de texto y al oprimir intro la aplicación busca la traducción. Si existe la traducción se muestra en un panel de diálogo. En caso contrario se muestra un mensaje, también en un panel de diálogo.

Traductor Español a Inglés Caso de Estudio: Traductor Español a Inglés Par   Diccionario GUIEspIng pal1,pal2:String T [] Par panelPalabras:JPanel cartelEntrada :JLabel cajaPalabra: JTextField diccionario : Diccionario <<Constructor>> GUIEspIng(tit:String, dic:Diccionario) Par(p1,p2:String) <<Consultas>> obtenerPal1() :String obtenerPal2() Diccionario() <<Comandos>> insertar(p:Par) traducirEngSpa (pan:String):String traducirEspIng (pal:String):String La clase GUIEspIng es cliente de la clase Diccionario. La implementación de estos servicios queda encapsulada en la clase proveedora y es transparente para la clase cliente.

Traductor Español a Inglés Caso de Estudio: Traductor Español a Inglés class GUIEspIng extends JFrame { //Atributos gráficos private JPanel panelPalabras; private JLabel cartelEntrada; private JTextField cajaPalabra; //Atributos de la aplicación private Diccionario diccionario; La clase que implementa la GUI encapsula un atributo de instancia que es instancia de la clase asociada Diccionario.

Traductor Español a Inglés Caso de Estudio: Traductor Español a Inglés public GUIEspIng (String tit, Diccionario dicc) { //Establece la apariencia del frame super(tit); setSize(400, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); diccionario = dicc; //Crea los objetos gráficos e invoca al método interno panelPalabras = new JPanel(); cartelEntrada = new JLabel(); cajaPalabra = new JTextField ("",15); armaGUI(); } La GUI recibe como parámetro un objeto de clase Diccionario y asigna la referencia al atributo de instancia, que puede ser accedido desde cualquier servicio.

Traductor Español a Inglés Caso de Estudio: Traductor Español a Inglés private void armaGUI(){ //Establece los atributos del panel panelPalabras.setLayout(new BorderLayout()); panelPalabras.setSize(400,90); panelPalabras.setPreferredSize (new java.awt.Dimension(400,90)); //Establece los atributos de la etiqueta cartelEntrada.setText("Ingrese una palabra"); cartelEntrada.setSize(120,15); cartelEntrada.setPreferredSize (new java.awt.Dimension(120,15)); cartelEntrada.setBorder(new LineBorder(new Color(0,0,0), 1, false)); …

Traductor Español a Inglés Caso de Estudio: Traductor Español a Inglés /*Establece los atributos de la caja, crea y registra al oyente*/ cajaPalabra.setSize(120,15); cajaPalabra.setPreferredSize(new java.awt.Dimension(120,15)); cajaPalabra.setBorder(new LineBorder(new Color(100,100,100), 1, false)); OyentePalabra oyente = new OyentePalabra(); cajaPalabra.addActionListener(oyente);

Traductor Español a Inglés Caso de Estudio: Traductor Español a Inglés //Inserta los objetos gráficos en los paneles panelPalabras.add(cartelEntrada,BorderLayout.NORTH); panelPalabras.add(cajaPalabra,BorderLayout.CENTER); getContentPane().setLayout(new BorderLayout()); getContentPane().add(panelPalabras,BorderLayout.NORTH);

Traductor Español a Inglés Caso de Estudio: Traductor Español a Inglés private class OyentePalabra implements ActionListener { public void actionPerformed(ActionEvent event){ String palabra = cajaPalabra.getText(); JOptionPane dialogo = new JOptionPane(); String traducida = diccionario.traducirEspIng(palabra); if (traducida == null) dialogo.showMessageDialog(null, "La palabra no figura en el diccionario","", dialogo.INFORMATION_MESSAGE ); else{ cajaPalabra.setText(""); "La traduccion de "+palabra+ " es " + traducida,"", }

Caso de Estudio: Traductor El objeto ligado a la variable palabra se inicializa en el oyente de la caja y se usa para buscar la traducción. La implementación de cada clase oyente requiere acceder a un diccionario. El diccionario es una estructura de datos que mantiene pares de palabras, la primera palabra del par está en inglés y la segunda en español. La estructura está encapsulada en una clase Diccionario que brinda dos servicios de búsqueda, buscar en la primera palabra de cada par o en la segunda.

Caso de Estudio: Traductor La clase GUITraductor usa a la clase Diccionario como una caja negra, conoce únicamente la interface y el contrato. Los datos pueden estar modelados por un arreglo o un objeto de clase Vector, las búsquedas pueden implicar un recorrido secuencial o la estructura puede estar ordenada y se aplica entonces búsqueda binaria. Todas esas cuestiones quedan escondidas para la interfaz. De manera análoga, es posible cambiar el diseño y la implementación de la GUI, sin afectar a la clase Diccionario.

Caso de Estudio: Traductor Implemente una clase GUI_Traductor que permita mostrar la traducción de una palabra ingresada en inglés a español o una palabra ingresada en español a inglés. La clase GUI_Traductor está asociada a Diccionario. La clase Diccionario encapsula a una colección de pares de palabras, la primera palabra del par está en inglés y la segunda es su traducción al español. Claramente un objeto de clase Diccionario puede utilizarse para traducir de inglés a español o de español a inglés.

Caso de Estudio: Traductor Par   Diccionario GUI_Traductor pal1,pal2:String T [] Par panelPalabras, panelControl:JPanel botonES,botonEI:JButton cartelEntrada :JLabel cajaPalabra: JTextField diccionario : Diccionario palabra:String <<Constructor>> GUI_Traductor(tit:String, dic:Diccionario) Par(p1,p2:String) <<Consultas>> obtenerPal1() :String obtenerPal2() Diccionario() <<Comandos>> insertar(p:Par) traducirEngSpa (pan:String):String traducirEspIng (pal:String):String La clase GUI_Traductor es cliente de la clase Diccionario. La implementación de estos servicios queda encapsulada en la clase proveedora y es transparente para la clase cliente.

Caso de Estudio: Traductor El usuario completa la caja de texto y al oprimir Intro se habilitan los dos botones. Cada botón está asociado a un oyente que envía un mensaje al diccionario para buscar la palabra. Si existe la traducción se muestra en un panel de diálogo. En caso contrario se muestra un mensaje, también en un panel de diálogo.

Caso de Estudio: Traductor //Atributos gráficos private JPanel panelPalabras, panelControl; private JButton botonES,botonEI; private JLabel cartelEntrada; private JTextField cajaPalabra; //Atributos de la aplicación private Diccionario diccionario; private String palabra; public GUITraductor (Diccionario dicc) { diccionario = dicc; … }

Caso de Estudio: Traductor //Deshabilita los botones estadoBotones(false); /*Crea los oyentes y los registra a los objetos fuente de evento*/ OyentePalabra oyente = new OyentePalabra(); cajaPalabra.addActionListener(oyente); OyenteBotonES oyenteES = new OyenteBotonES(); botonES.addActionListener(oyenteES); OyenteBotonEI oyenteEI = new OyenteBotonEI(); botonEI.addActionListener(oyenteEI);

Caso de Estudio: Traductor private void estadoBotones(boolean estado){ //Habilita o deshabilita botones botonEI.setEnabled(estado); botonES.setEnabled(estado); } private class OyentePalabra implements ActionListener { public void actionPerformed(ActionEvent event){ palabra = (cajaPalabra.getText()); estadoBotones(true);

Caso de Estudio: Traductor private class OyenteBotonES implements ActionListener { public void actionPerformed(ActionEvent e){ JOptionPane dialogo = new JOptionPane(); String tra=diccionario.traducirEngSpa(palabra); if (tra == null) dialogo.showMessageDialog(null, "La palabra no figura en el diccionario","", dialogo.INFORMATION_MESSAGE ); else{ cajaPalabra.setText(""); estadoBotones(false); "La traduccion de "+palabra+ " es " + tra, "", }

Caso de Estudio: Traductor private class OyenteBotonEI implements ActionListener { public void actionPerformed(ActionEvent e){ JOptionPane dialogo = new JOptionPane(); String tra=diccionario.traducirEspIng(palabra); if (tra == null) dialogo.showMessageDialog(null, "La palabra no figura en el diccionario","", dialogo.INFORMATION_MESSAGE ); else{ cajaPalabra.setText(""); estadoBotones(false); "La traduccion de "+palabra+ " es " + tra, "", }

Caso de Estudio: Traductor Cuando el usuario realiza una acción sobre botonES se envía el mensaje traducirEngSpa(palabra) al diccionario. Análogamente cuando el usuario realiza una acción en botonEI se envía el mensaje traducirEngSpa(palabra) al diccionario. Otra característica que aparece en esta GUI es que los botones se habilitan y deshabilitan.

Objetos y Eventos El objeto fuente de evento botonEI crea un objeto evento de clase ActionEvent Evento Componente reactiva El usuario hace clik sobre la componente reactiva asociado al objeto fuente de evento botonEI El objeto oyente oyenteEI registrado al objeto fuente de evento botonEI, recibe un mensaje actionPerformed con el objeto evento e como parámetro.

Caso de Estudio: Reserva de Pasajes Implemente una GUI que seleccionar un micro dentro de una flota y luego reservar o liberar un asiento. Todos los micros tienen habilitados 10 asientos para la venta.

Caso de Estudio: Reserva de Pasajes Cada asiento está asociado a un botón, cuando el usuario oprime el botón la GUI muestra un cuadro de diálogo: Si el usuario confirma la acción, el asiento queda reservado:

Caso de Estudio: Reserva de Pasajes Micro FlotaMicros GUI_Venta_Pasajes

Caso de Estudio: Reserva de Pasajes import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GUI_Venta_Pasajes extends JFrame{ //Atributos de la aplicación private FlotaMicros colMicros; private Micro micro; //Atributos gráficos private final int cantbotones = 10; private JButton[] botones; private JLabel labelInfo; private JPanel panSeleccionar, panInfo, panAsientos; private JComboBox comboBoxmicros;

Caso de Estudio: Reserva de Pasajes colMicros = col; public GUI_Venta_Pasajes(FlotaMicros col){ super("IPOO 2013 - Venta de Pasajes"); setDefaultCloseOperation(EXIT_ON_CLOSE); colMicros = col; construirGUI(); pack(); setResizable(false); setLocationRelativeTo(null); setSize(500,150); }

Caso de Estudio: Reserva de Pasajes private void construirGUI(){ panSeleccionar = new JPanel(); armarPanSeleccionar(); panInfo = new JPanel(); armarPanInfo(); panAsientos = new JPanel(); armarPanAsientos(); Container cp = getContentPane(); cp.setLayout(new BoxLayout(cp,BoxLayout.Y_AXIS)); cp.add(panSeleccionar); cp.add(panInfo); cp.add(panAsientos); panInfo.setVisible(false); panAsientos.setVisible(false); }

Caso de Estudio: Reserva de Pasajes private void armarPanSeleccionar(){ String[] codmicros = new String[colMicros.cantElementos()]; int n; Micro m; for (int i=0; i< colMicros.cantElementos(); i++){ m = colMicros.obtenerMicro(i); n = m.obtenerNumero(); codmicros[i] = ""+n; } …

Caso de Estudio: Reserva de Pasajes private void armarPanSeleccionar(){ … //Desde aca JButton btnSeleccionar = new JButton("Seleccionar"); OSeleccionar oySeleccionar = new OSeleccionar(); btnSeleccionar.addActionListener(oySeleccionar); comboBoxmicros = new JComboBox(codmicros); panSeleccionar.add(comboBoxmicros); panSeleccionar.add(btnSeleccionar); //Hasta aca }

Caso de Estudio: Reserva de Pasajes private void armarPanInfo(){ labelInfo = new JLabel(""); panInfo.add(labelInfo); } private void armarPanAsientos(){ panAsientos.setLayout( new GridLayout(1,cantbotones) ); botones = new JButton[cantbotones]; OyenteBotones oyBotones = new OyenteBotones(); for (int i = 0; i < cantbotones; i++){ botones[i] = new JButton((i+1)+""); botones[i].addActionListener(oyBotones); panAsientos.add(botones[i]);

Caso de Estudio: Reserva de Pasajes private class OSeleccionar implements ActionListener{ public void actionPerformed(ActionEvent e){ int num = Integer.parseInt (comboBoxmicros.getSelectedItem().toString()); El servicio getSelectedItem() retorna la cadena de caracteres que corresponde el ítem del combo box seleccionado por el usuario. Convertimos esta cadena de caracteres en un número para buscar en la colección de micros, el micro que corresponde a ese número.

Caso de Estudio: Reserva de Pasajes private class OSeleccionar implements ActionListener{ public void actionPerformed(ActionEvent e){ int num = Integer.parseInt (comboBoxmicros.getSelectedItem().toString()); micro = colMicros.recuperarMicro( num); labelInfo.setText(micro.toString()); for (int i = 0; i < cantbotones; i++){ if (micro.estaDisponible(i)) botones[i].setBackground(Color.GREEN); else botones[i].setBackground(Color.RED); } panInfo.setVisible(true); panAsientos.setVisible(true); } }

Caso de Estudio: Reserva de Pasajes private class OyenteBotones implements ActionListener{ public void actionPerformed(ActionEvent e){ JButton boton = (JButton) e.getSource(); El servicio getSource() retorna la componente que percibió la acción del usuario, en este caso un botón.

Caso de Estudio: Reserva de Pasajes private class OyenteBotones implements ActionListener{ public void actionPerformed(ActionEvent e){ JButton boton = (JButton) e.getSource(); String textoBoton = boton.getText(); int asiento = Integer.parseInt(textoBoton); Cada botón está rotulado con un texto que representa el número de asiento. Este texto se convierte en un entero para ser usado como subíndice del arreglo.

Caso de Estudio: Reserva de Pasajes private class OyenteBotones implements ActionListener{ public void actionPerformed(ActionEvent e){ JButton boton = (JButton) e.getSource(); String textoBoton = boton.getText(); int asiento = Integer.parseInt(textoBoton); int res = JOptionPane.showConfirmDialog(null, "Confirma la acción? ","", JOptionPane.YES_NO_OPTION); Se crea un cuadro de diálogo que le permite al usuario confirmar o cancelar la acción de reservar o liberar el asiento.

Caso de Estudio: Reserva de Pasajes private class OyenteBotones implements ActionListener{ public void actionPerformed(ActionEvent e){ JButton boton = (JButton) e.getSource(); String textoBoton = boton.getText(); int asiento = Integer.parseInt(textoBoton); int res = JOptionPane.showConfirmDialog(null, "Confirma la acción? ","", JOptionPane.YES_NO_OPTION); if (res == JOptionPane.YES_OPTION) if (boton.getBackground().equals(Color.GREEN)){ boton.setBackground(Color.RED); micro.vender(asiento-1); } else{ micro.liberar(asiento-1); boton.setBackground(Color.GREEN); } } }

Caso de Estudio: Reserva de Pasajes micro.vender(asiento-1); Observemos que la variable micro mantiene una referencia a un objeto que también está referenciado en la colección de micros. Cuando este objeto recibe el mensaje vender se modifica el estado interno del atributo de instancia que representa al conjunto de asientos.