Programación Orientada a Objetos GUI en JAVA Angela C. Carrillo Ramos Manejo de eventos Técnica de programación avanzada Se trabaja con mensajes Maneja contenedores Objetos que escuchan y procesan eventos Objetos que producen eventos Pueden ser utilizados para separar diferentes niveles conceptuales, v.gr. gr., la interfaz con el modelo del mundo. mundo. Sirve de apoyo a algunos patrones de diseño.. diseño 1 Modelo de eventos TODO Posibles aplicaciones Control de negocio Interfaces Interacción entre objetos Utilizar el ejemplo de la tienda (número de items < que una cantidad dada) Listeners Adapters Eventos Modelo de Eventos en Java Componentes (gráficos) son fuente de eventos Click en el botón O.K. El botón genera un evento! El botón es la fuente del evento 2 Eventos Modelo de eventos de delegación Se basa en el patrón de diseño MVC (Model--View(Model View-Controller, ModeloModelo-VistaVistaControlador) Almacenar el estado interno en un conjunto de clases llamado modelo Mostrar la información del modelo en una vista Cambiar la información del modelo en un controlador Eventos Modelo de Eventos en Java Todo componente tiene eventos. eventos. Dichos eventos son predefinidos. predefinidos. Paquete: java. Paquete: java.util. util.EventObject Un evento es un objeto que contiene información del contexto en el que ocurrió. ocurrió. Button List TextField ActionEvent MouseEvent, ItemEvent ActionEvent, TextEvent 3 Eventos Modelo de Eventos en Java MenuItem Checkbox Choice ScrollPane Scrollbar TextArea Action Event ItemEvent ItemEvent AdjustmentEvent AdjustmentEvent TextEvent Applet Modelo de Eventos en Java Existen eventos especiales que actúan sobre todos los componentes: componentes: ComponentEvent FocusEvent KeyEvent MouseEvent 4 Eventos Swing AncestorEvent ChangeEvent DocumentEvent MenuEvent HyperlinkEvent Eventos EventObject AWT Event Action Event Container Event Adjustment Event Component Event Item Event Text Event Focus Event Input Event Paint Event Window Event Key Event Mouse Event 5 Eventos ¿Quién reacciona ante el evento? Escucha (Listener) 1. 2. El contenedor (panel) debe subscribirse como escucha al componente(botón) Cuando el evento ocurre, los escuchas son informados para que reaccionen.. reaccionen Modelo de Eventos addActionListener Panel O.K. actionPerformed getObject ActionEvent 6 Ejemplo Panel p = new Panel(); Button b = new Button(“O.K”); b.addActionListener(p); El panel se subscribe al botón como escucha Paquete Gráfico Independiente de la plataforma Se trabaja con COMPONENTES prefabricados Maneja contenedores Agrupación de COMPONENTES. COMPONENTES. Controla el tamaño y posicionamiento Frame, Panel, Applet Layout:: Distribución de los componentes Layout 7 Paquete Gráfico Component Objeto fundamental en la Interfaz de usuario Contenedor: son a su vez componentes Funcionalidad: Apariencia y Comportamiento Atributos: visibilidad, tamaño, localización Comportamiento: Obedece a eventos Comunica a su contenedor si va a afectar a otros componentes Paquete Gráfico Contenedor (Container) Aloja y maneja otros componentes: Frame, Panel, Applet add() Adiciona componente remove() Elimina componente 8 Applets Pequeñas aplicaciones que tienen acceso a un servidor Internet, son transportadas a través de la red y se ejecutan como parte de un documento HMTL <applet code=“nom.class” width=200 height=40> </applet> También pueden ser apreciadas con AppletViewer Applet Orden de inicialización de un applet init start stop destroy Otros métodos son: paint update 9 Applet Restricciones de Seguridad No puede leer o escribir archivos en el host local Sólo pueden abrir conexiones de red al servidor donde se encuentran. encuentran. No pueden correr otros procesos en el host local Pueden trabajar con servidores para almacenar y comunicar datos. datos. (usando RMI, por ejemplo) Applet ¿Cómo se define? class nomclase extends Applet{ <cuerpo de la clase> } class nomclase extends JApplet{ <cuerpo de la clase> } 10 Applet en AWT Imprime el mensaje Hola Mundo import java.awt.*; import java.applet.*; public class HelloWorld extends Applet { public void paint(Graphics g) { g.drawString("Hello World !", 20, 20); } } Applet en Swing Imprime el mensaje Hola Mundo import javax.swing.*; import java.awt.*; public class HelloWorld extends JApplet { public void paint(Graphics g) { g.drawString("Hello World !", 20, 20); } } 11 Applet <HTML> <BODY> <APPLET code=CambioMoneda.class WIDTH=250 HEIGHT=100> <PARAM NAME=valor VALUE=70000> <PARAM NAME=cActual VALUE=1580> </APPLET> <BR> <BR>(<A HREF="CambioMoneda.java">C&oacute;digo</A>) </BODY> </HTML> Applet import java.awt.*; import java.applet.*; public class CambioMoneda extends Applet { public void paint(Graphics g) { String strCambio = getParameter("cActual"); String strValor = getParameter("valor"); System.out.println( "cambio: " + strCambio + "; valor: " + strValor ); double cambio = ( Double.valueOf(strCambio) ).doubleValue(); double valor = ( Double.valueOf(strValor) ).doubleValue(); g.drawString("El valor en dolares de " + valor + " pesos es: " + valor/cambio, 20, 20); } } 12 Ejemplo public class MiPanel extends Panel implements ActionListener { ... actionPerformed((ActionEvent evt) public void actionPerformed { // Qué se debe hacer cuando se hace click en el botón } } Ejemplo 2 (AWT) import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class TextEntryBox extends Applet implements ActionListener{ TextArea area; TextField campo; 13 Ejemplo 2 (AWT) public void init(){ setLayout(new BorderLayout()); add(“Center”, area=new TextArea()); area.setFont(new Font(“TimesRoman”,Font.BOLD,18)); area.setText(“Hola a todos!”); add(“South”, campo = new TextField()); campo.addActionListener(this); } Ejemplo 2 (AWT) public void actionPerformed(ActionEvent e){ area.append(campo.getText() + ‘\‘\n’); campo.setText(“”); } } 14 Ejemplo 2 (Swing) Coloca todo lo del campo de texto en la Caja de Texto import javax.swing.*; import java.awt.event.*; import java.awt.*; public class TextEntryBox extends JApplet implements ActionListener{ JTextArea area; JTextField campo; Ejemplo 2 (Swing) public void init(){ getContentPane().setLayout(new BorderLayout()); getContentPane().add("Center",area=new JTextArea()); area.setFont(new Font("TimesRoman",Font.BOLD,18)); area.setText("Hola a todos!"); getContentPane().add("South",campo = new JTextField()); campo.addActionListener(this); } 15 Ejemplo 2 (Swing) public void actionPerformed(ActionEvent e){ area.append(campo.getText() + '\'\n'); campo.setText(""); } } Ejemplo 3 import java.awt.*; import java.applet.*; import java.awt.event.*; public class ListaProgramas extends Applet{ public void init(){ String [] items = {“Pregrado”,”Magister”,”Especialización”}; add(new ListaSeleccion(items)); } } 16 Ejemplo 3 class ListaSeleccion extends Container implements ActionListener{ List lista; TextField texto; ListaSeleccion (String [] items){ lista = new List(2); for(int i=0; i<items.length;i++) lista.addItem(items [i]); texto = new TextField(); texto.addActionListener(this); setLayout (new BorderLayout()); add(“Center”, lista); add(“South”,texto); } Ejemplo 3 public void actionPerformed(ActionEvent e){ String busqueda = texto.getText(); for (int i=0; i < lista.getItemCount(); i++) if (lista.getItem(i).equals(busqueda){ lista.select(i); lista.makeVisible(i); break; } texto.setText(“”); } } 17 Ejemplo Tokenizador Tokenizador: Procesa una oración recibida Tokenizador: y la descompone en palabras, indicando el número de veces que se repite cada una de las palabras Si la oración es: es: La casa de la loma El resultado es: es: La 2 Casa 1 De 1 Loma 1 Ejemplo Tokenizador (AWT) import java.awt.*; import java.awt.event.*; import java.awt.Toolkit; import java.io.*; public class AppletEjemplo extends java.applet.Applet { /* -------------------------------------------------------* Atributos de la clase * -------------------------------------------------------- */ Tokenizador procesador = new Tokenizador(); // Tokenizador para descomponer una oración en palabras 18 Ejemplo Tokenizador (AWT) // Componentes para la interfaz // Entrada TextField oracion = new TextField (80); // Campo de texto para leer la oración // Salida TextArea resultado = new TextArea(5,80); //Area de texto para mostrar resultados // Botones Button procesar = new Button("Procesar"); // Botón para descomponer la oración Button limpiar = new Button("Limpiar"); // Boton para limpiar los campos Button salir = new Button("Salir"); // Boton para terminar el programa public void init() { //---------------------------------------------------------------------//---------------------------------------------------------------------// Pinta la interfaz del applet //---------------------------------------------------------------------//---------------------------------------------------------------------// PRE: True // POST: True //---------------------------------------------------------------------//---------------------------------------------------------------------- Ejemplo Tokenizador (AWT) setLayout(new FlowLayout()); // Mostrar los campos para leer la oración. Panel panelOracion = new Panel(); panelOracion.setLayout(new GridLayout(2,1)); Label labelOracion = new Label("Escriba la oración a procesar."); panelOracion.add(labelOracion); panelOracion.add(oracion); add(panelOracion); 19 Ejemplo Tokenizador (AWT) // Mostrar los campos para mostrar los resultados. Panel panelResultado = new Panel(); panelResultado.setLayout(new GridLayout(2,1)); Label labelResultado = new Label("El resultado es:"); panelResultado.add(labelResultado); panelResultado.add(resultado); add(panelResultado); // Mostrar Botones Panel panelBotones = new Panel(); panelBotones.setLayout(new FlowLayout()); panelBotones.add(procesar); panelBotones.add(limpiar); panelBotones.add(salir); add(panelBotones); Ejemplo Tokenizador (AWT) // //-- Asociar comportamiento a los eventos -----------------------procesar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ProcesarOracion(); } }); limpiar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { LimpiarCampos(); } }); salir.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); } 20 Ejemplo Tokenizador (AWT) public void ProcesarOracion() { // //----------------------------------------------------------------------------------------------------------------------------------------// Procesa la oración que está en el campo de texto "oracion" // //----------------------------------------------------------------------------------------------------------------------------------------// PRE: True // POST: True // //----------------------------------------------------------------------------------------------------------------------------------------// Procesar la oración y mostrar resultados procesador.Procesar(oracion.getText()); procesador.GenerarResultados(resultado); } Ejemplo Tokenizador (AWT) public void LimpiarCampos() { // //----------------------------------------------------------------------------------------------------------------------------------------// Limpia los campos de entrada y salida // //----------------------------------------------------------------------------------------------------------------------------------------// PRE: True // POST: True // //----------------------------------------------------------------------------------------------------------------------------------------// Limpiar los campos oracion.setText(""); resultado.setText(""); } } 21 Ejemplo Tokenizador (Swing) import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; public class AppletEjemplo extends JApplet { // Atributos de la clase Tokenizador procesador = new Tokenizador(); // Tokenizador para descomponer una oración en palabras Ejemplos Swing // Componentes para la interfaz // Entrada JTextField oracion = new JTextField (40); // Campo de texto para leer la oración // Salida JTextArea resultado = new JTextArea(5,40); //Area de texto para mostrar resultados // Botones JButton procesar = new JButton("Procesar"); // Botón para partir la oración JButton limpiar = new JButton("Limpiar"); // Boton para limpiar los campos JButton salir = new JButton("Salir"); // Boton para terminar el programa 22 Ejemplo Tokenizador (Swing) public void init() { getContentPane().setLayout(new FlowLayout()); // Mostrar los campos para leer la oración. JPanel panelOracion = new JPanel(); panelOracion.setLayout(new GridLayout(2,1)); JLabel labelOracion = new JLabel("Escriba la oración a procesar."); panelOracion.add(labelOracion); panelOracion.add(oracion); getContentPane().add(panelOracion); Ejemplo Tokenizador (Swing) // Mostrar los campos para mostrar los resultados. JPanel panelResultado = new JPanel(); panelResultado.setLayout(new GridLayout(2,1)); JLabel labelResultado = new JLabel("El resultado es:"); panelResultado.add(labelResultado); resultado.setLineWrap(true); /* para cortar las líneas de acuerdo al tamaño del área de texto */ panelResultado.add(new JScrollPane(resultado)); //El área de texto tiene un Scroll. Se debe crear un panel que permita esto y adicionar a dicho panel el área de texto. getContentPane().add(panelResultado); 23 Ejemplos Swing // Mostrar Botones JPanel panelBotones = new JPanel(); panelBotones.setLayout(new FlowLayout()); panelBotones.add(procesar); panelBotones.add(limpiar); panelBotones.add(salir); getContentPane().add(panelBotones); // //-- Asociar comportamiento a los eventos -----------------------procesar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ProcesarOracion(); } }); Ejemplo Tokenizador (Swing) limpiar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { LimpiarCampos(); } }); salir.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); } 24 Ejemplo Tokenizador (Swing) public void ProcesarOracion() { // //------------------------------------------------------------------------------------------------------------------------------------------// Procesa la oración que está en el campo de texto "oracion" // //------------------------------------------------------------------------------------------------------------------------------------------// PRE: True // POST: True // //------------------------------------------------------------------------------------------------------------------------------------------// Procesar la oración y mostrar resultados procesador.Procesar(oracion.getText()); procesador.GenerarResultados(resultado); } Ejemplo Tokenizador (Swing) public void LimpiarCampos() { // //------------------------------------------------------------------------------------------------------------------------------------------// Limpia los campos de entrada y salida // //------------------------------------------------------------------------------------------------------------------------------------------// PRE: True // POST: True // //------------------------------------------------------------------------------------------------------------------------------------------// Limpiar los campos oracion.setText(""); resultado.setText(""); } } 25 Ejemplo Tokenizador (Swing) public void GenerarResultados(JTextArea area) { int i; Palabra p; area.setText(""); for ( i=0; i<palabras.size(); i++ ) { p=(Palabra)palabras.elementAt(i); area.append(p.GetPalabra() + "\ "\t" + p.GetRepeticiones() + "\ "\n"); } } 26