Download InterfacesGráficasalUsuarioyEventos Conceptos Conceptos
Document related concepts
no text concepts found
Transcript
Conceptos Interfaces Gráficas al Usuario y Eventos • toda GUI debe tener una ventana padre que la contiene y que, generalmente, administra el thread o hilo de ejecución que responde a los eventos. (a) conceptos (b) modelo de manejo de eventos de java.awt (c) interfaces para oyentes (d) jerarquı́as de componentes (e) paquete javax.swing • además, una GUI dispone de un conjunto de componentes que son los elementos a partir de los cuales se construye la interface. Componentes Programación Orientada a Objetos – DCIC UNS – 2002 271 Programación Orientada a Objetos – DCIC UNS – 2002 Conceptos Componentes simples Contenedores 273 Conceptos Arquitectura de una GUI Un evento es una acción por parte de un usuario sobre un dispositivo de entrada, que puede generar una reacción por parte del sistema de software en ejecución. Es inherentemente asincrónico con la ejecución del sistema. El objetivo de los eventos es realizar la comunicación desde el usuario al sistema de software. La interface gráfica al usuario (GUI) es un subsistema de objetos gráficos que permite al usuario generar eventos, provee realimentación de su ocurrencia, y muestra la respuesta del software. Las GUIs realizan la mayor parte del trabajo de entrada/salida interactiva. Programación Orientada a Objetos – DCIC UNS – 2002 272 Programación Orientada a Objetos – DCIC UNS – 2002 274 Conceptos Modelo de Manejo de Eventos de java.awt Paquetes Estándares en JAVA • cada componentes, ya sea simple o contenedor, tiene asociado un conjunto de objetos oyentes de eventos. Estos objetos son activados por thread de la ventana padre cada vez que un evento se produce. • entre todos los componentes que contiene laa ventana padre, existe uno destacado que se denomina en foco. Este componente es el que está activo para responder a los eventos. • el foco puede cambiarse con el ratón, o con la tecla TAB. • una vez generado el evento, la ventana padre determina el componente en foco, y entonces su oyente es activado ejecutando el manejador de eventos correspondiente. Programación Orientada a Objetos – DCIC UNS – 2002 275 Modelo de Manejo de Eventos de java.awt • en JAVA un paquete es un conjunto de clases relacionadas. • los paquetes estándares son librerı́as de clases, tanto abstractas como concretas, que cubren la mayorı́a de las aplicaciones. • se dividen en las librerı́as de núcleo (JAVA core APIs), soportadas por todas las máquinas virtuales, y las extensiones estándares, soportadas sólo por las máquinas virtuales completas. • sin embargo, sólo los dispositivos con recursos muy limitados no incluyen las extensiones estándares. Programación Orientada a Objetos – DCIC UNS – 2002 277 Modelo de Manejo de Eventos de java.awt Las librerı́as de núcleo estan presentes en todas las plataformas JAVA. • el paquete java.awt (“another window toolkit”) es un paquete estándar de JAVA que soporta componentes y eventos sobre el SO (heavyweight). • provee el funcionamiento básico común a todas las plataformas, y por lo tanto es muy elemental. • java.lang: clases Object, Class, Thread, String, StringBuffer, Math y las wrapper classes. • java.io: clases para la entrada/salida y manipulación de distinto tipos de archivos. • java.util: algunas estructuras de datos usuales, tales como Vector, Enumeration, Dictionary, Date, Hashtable, y Stack. • el paquete javax.swing, en cambio, soporta componentes implementados totalmente sobre la máquina virtual (lightweight). Provee una funcionalidad más extensa y avanzada. Programación Orientada a Objetos – DCIC UNS – 2002 276 • java.text: clases para crear formatos internacionales de números y fechas, y órdenes de búsqueda. Programación Orientada a Objetos – DCIC UNS – 2002 278 Modelo de Manejo de Eventos de java.awt • java.awt: abstract window toolkit, para definir GUI’s con interface al sistema independiente de la plataforma, pero la implementación hace uso de llamadas al SO (componentes hevyweight). • javax.swing: GUI’s lightweight que extiende y mejora la funcionalidad de java.awt. Modelo de Manejo de Eventos de java.awt • el paquete java.awt incluye las herramientas necesarias para poder definir una interface gráfica al usuario en cualquier aplicación JAVA. • las interfaces de estas clases no dependen de una plataforma especı́fica, por lo que puede usarse el mismo código JAVA en distintas máquinas. • el paquete define los siguientes categorı́as de clases: • java.applet: la clase Applet y otras relacionadas. • java.math: clase que implementa tipos de datos numéricos grandes. Programación Orientada a Objetos – DCIC UNS – 2002 279 Modelo de Manejo de Eventos de java.awt – componentes simples – componentes contenedores – oyentes de eventos – layouts – manejo de gráficos y texto Programación Orientada a Objetos – DCIC UNS – 2002 281 Modelo de Manejo de Eventos de java.awt Otros paquetes estándares son: • java.net: clases para trabajar en red (manejo de sockets, URLs, HTTP, etc.). • java.beans: componentes para escribir que el usuario pueda escribir código combinable. Permite usar los componentes en ambientes gráficos de programación. • java.rmi: clases para invocación remota de servicios, ya sea en diferentes máquinas virtuales o fı́sicas. • java.sql: paquete para acceder a bases de datos relacionales desde programas hechos en JAVA. • java.security: paquete con código para encriptación, autenticación, firmas digitales y otras clases relacionadas con seguridad. Los elementos básicos de una interface gráfica están en la clase Component, que tiene varias clases descendientes: campo de texto botón listas de elección cajas de selección botones de opción Component etiquetas áreas de texto barras de desplazamiento Canvas Container • java.mail: paquete para acceder a servidos de mail a través de protocolos IMAP, SMTP, o POP. Programación Orientada a Objetos – DCIC UNS – 2002 280 Programación Orientada a Objetos – DCIC UNS – 2002 282 Modelo de Manejo de Eventos de java.awt java.awt vs. java.swing Modelo de Manejo de Eventos de java.awt • cada componente responde sólo a los eventos que ocurren sobre él. • estos objetos implementan interfaces especı́ficas que son activadas por la máquina virtual. • fue incorporado en la versión 1.2, también llamada JAVA 2. • para esto, se le asocia un objeto oyente para cada uno de los eventos. • java.swing es un paquete que extiende a java.awt, y que permite crear componentes con visualización independiente de la plataforma (componentes lightweight). • el modelo de eventos es el mismo, cambian las clases que la forman. • los nombres de los componentes equivalentes agregan una “J” delante del nombre original de java.awt. Por ejemplo JButton. • permiten además nuevos componentes, posibilidad de tooltips, doble-buffering, de operaciones deshacer, etc. Programación Orientada a Objetos – DCIC UNS – 2002 283 Modelo de Manejo de Eventos de java.awt El siguiente esquema es el seguido por la mayorı́a de las aplicaciones con GUI: Programación Orientada a Objetos – DCIC UNS – 2002 285 Modelo de Manejo de Eventos de java.awt El siguiente Applet muestra varios componentes ejecutándose en un entorno Windows. • todas estas clases tienen servicios para dibujarse y posicionarse dentro de la interface, habilitarse o no, obtener o cambiar su contenido, y responder a eventos generados por el usuario. Programación Orientada a Objetos – DCIC UNS – 2002 284 Programación Orientada a Objetos – DCIC UNS – 2002 286 Modelo de Manejo de Eventos de java.awt La clase Container es ancestro de todas las clases que pude contener varios de estos componentes. Modelo de Manejo de Eventos de java.awt Por ejemplo el siguiente código componente.addMouseListener(oyente); asocia el objeto oyente con componente para actuar ante la ocurrencia de un evento del grupo del mouse. • una de las ventajas de este esquema es que el mismo oyente puede ser asociado a varios componentes. • todos las instancias de Container, además de sus servicios como instancias de Component, tienen servicios para agregar y sacar componentes, definir estilos de visualización conjunta de sus componentes, incluir dibujos, sonidos o animaciones, etc.. Programación Orientada a Objetos – DCIC UNS – 2002 287 Modelo de Manejo de Eventos de java.awt • el código generado por ambientes de programación visual no posee todo el poder expresivo del modelo de manejo de eventos. Programación Orientada a Objetos – DCIC UNS – 2002 289 Interfaces para Oyentes de Eventos Java 1.1 AWT soporta los siguientes grupos de eventos: • focus: eventos generados cuando un componente obtiene y pierde el foco de la interacción con el usuario. Puede ser capturado por todos los componentes. • cada grupo de eventos tiene definido una interface con los servicios abstractos para responder ante su ocurrencia. Las clases que implementan las respectivas interfaces, y sus instancias, se denominan oyentes para ese grupo de eventos. • action: evento generado cuando el usuario termina de usar un componente. Puede ser capturado por botones, listas de selección, campos de texto y elementos de menú. • en JAVA 1.1, el paquete AWT clasifica los eventos en grupos de eventos para manejarlos en forma conjunta. • para que un componente responda a un evento tiene que tener asociado al menos un oyente que implemente la conducta del componente cada vez que ocurre el evento. Programación Orientada a Objetos – DCIC UNS – 2002 288 • item: eventos generados cuando se cambia el estado de un componente. Puede ser capturado por cajas de selección, opciones y listas de selección. Programación Orientada a Objetos – DCIC UNS – 2002 290 Interfaces para Oyentes de Eventos Grupos de eventos en JAVA 1.1 (cont.): Action • key: eventos generados desde el teclado, respondiendo el componente que tiene el foco en ese momento. No es necesario implementarlo para el funcionamiento normal de campos y áreas de texto. Puede ser capturado por todos los componentes. Container Component 291 Interfaces para Oyentes de Eventos Grupo de Operaciones de la interface Eventos Item • mouse: eventos generados desde el mouse, respondiendo el componente sobre el cual se encuentra el puntero del mouse. Puede ser capturado por todos los componentes. • mouse motion: eventos generados por el movimiento y draggeado del mouse. Puede ser capturado por todos los componentes. • text: evento generado cuando se cambia el contenido de texto de un campo o un área de texto. Programación Orientada a Objetos – DCIC UNS – 2002 actionPerformed(ActionEvent e) itemStateChanged(ItemEvent e) componentAdded(ContainerEvent e) componentRemoved(ContainerEvent e) componentHidden(ComponentEvent e) componentMoved(ComponentEvent e) componentResized(ComponentEvent e) componentShown(ComponentEvent e) Programación Orientada a Objetos – DCIC UNS – 2002 Interfaces para Oyentes de Eventos 292 Componentes Button List TextField Checkbox Choice List Dialog Frame Panel todos 293 Interfaces para Oyentes de Eventos Grupo de Operaciones de la interface Eventos Grupos de eventos en JAVA 1.1 (cont.): • window: eventos generados por las acciones sobre ventanas tales como abrir, cerrar, iconizar, etc.. Puede ser capturado por Dialog, Frame y Window. • component: eventos generados cuando se modifica alguna propiedad (ocultamiento,tamaño,posición) de un componente. Puede ser capturado por cualquier componente. • container: eventos generados cuando se agrega o quita un componente de algún contenedor. Puede ser capturado por todos los contenederos. Programación Orientada a Objetos – DCIC UNS – 2002 Text textValueChanged(TextEvent e) Mouse mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) MouseMotion mouseDragged(MouseMotionEvent e) mouseMoved(MouseMotionEvent e) focusGained(FocusEvent e) focusLost(FocusEvent e) Focus Programación Orientada a Objetos – DCIC UNS – 2002 Componentes TextArea TextField todos todos todos 294 Interfaces para Oyentes de Eventos Grupo de Operaciones de la interface Eventos Window windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e) Key keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e) Adjustment adjustmentValueChanged(AdjustmentEvent e) Componentes Frame Dialog todos Scrollbar Jerarquı́a de Componentes Funcionalidad general de la clase Component (cont.) • manejo de apariencia – setFont(Font f) y Font getFont() cambia y consulta el tipo de letra por default. – setBackgroundColor(Color c) y Color getBackgroundColor() cambia y consulta el color de fondo. – setForegroundColor(Color c) y Color getForegroundColor() cambia y consulta el color de frente. – setCursor(Cursor c) y Cursor getCursor() cambia y consulta el ı́cono que se muestra cuando el cursor del ratón se encuentra sobre el componente. • visibilidad y habilitación – setVisible(boolean b) y boolean isVisible() cambia y consulta el hecho de que el componente pueda verse en la pantalla. – setEnabled(boolean b) y boolean isEnabled() cambia y consulta el hecho de que el componente esté habilitado para interactuar con el usuario. Programación Orientada a Objetos – DCIC UNS – 2002 295 Programación Orientada a Objetos – DCIC UNS – 2002 Jerarquı́a de Componentes 297 Jerarquı́a de Componentes Funcionalidad general de la clase Component Funcionalidad general de la clase Component (cont.) Las siguiente son las operaciones más comunes soportadas por la clase Component, y heredadas por todas las demás. Cada clase los implementa, por lo que sólo es necesario redefinirlo si se quiere modificar el comportamiento estándar. Se muestran clasificados por responsabilidades: • visualización de acuerdo a la plataforma de ejecución – repaint() garantiza la visualización del componente sin interrupciones, y llama a update. – update(Graphics g) borra el área de pantalla asignada al componente, dibujando un rectángulo del color de fondo, y llama a paint. – paint(Graphics g) dibuja el componente. El parámetro g sirve para realizar dibujos y texto. Programación Orientada a Objetos – DCIC UNS – 2002 296 • visualización relativa – setMinimunSize(Dimension d) y Dimension getMinimunSize() cambia y consulta el tamaño mı́nimo a ser mostrado por un Layout. – setMaximunSize(Dimension d) y Dimension getMaximunSize() cambia y consulta el tamaño máximo a ser mostrado por un Layout. – setPreferredSize(Dimension d) y Dimension getPreferredSize() cambia y consulta el tamaño por default a ser mostrado por un Layout. Un Layout es un objeto que automáticamente cambia la visualización de los componentes cuando se modifican los parámetros externos. Programación Orientada a Objetos – DCIC UNS – 2002 298 Jerarquı́a de Componentes Funcionalidad general de la clase Component (cont.) Jerarquı́a de Componentes Funcionalidad general de la clase Component (cont.) Todas las operaciones para manejar eventos tienen un parámetro de tipo XXXEvent a partir del cual se puede extraer información particular sobre el evento producido. • visualización absoluta – setSize(Dimenzion d) y Dimension getSize() cambia y consulta el tamaño absoluto. – setLocation(Point p) y Point getLocation() cambia y consulta la posición relativa dentro del contenedor que lo contiene. – Point getLocationOnScreen() consulta la posición absoluta dentro de la pantalla. En el caso que la interface contenga más de una operación, existen en java.awt las clases XXXAdapter que implementan en forma trivial todas las operaciones del grupo. En este caso se puede heredar de estas clases cuando sólo se necesita manejar un subconjunto propio de eventos del grupo. Para la implementación de las clases oyentes, generalmente se usan clases internas y clases anónimas, definidas dentro de otras clases y que tienen acceso a las operaciones y atributos de las clase que la contiene. Programación Orientada a Objetos – DCIC UNS – 2002 299 Jerarquı́a de Componentes Funcionalidad general de la clase Component (cont.) Programación Orientada a Objetos – DCIC UNS – 2002 301 Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple • clase Button • manejo de oyentes de eventos – addXXXListener(XXXListener o) registra en el componente un oyente para el grupo de eventos XXX. – removeXXXListener(XXXListener o) elimina del componente un oyente para el grupo de eventos XXX. Los oyentes de un componente son los objetos que reaccionan frente a la ocurrencia de un evento sobre el componente. Cada evento tiene asociado una operación que es el mensaje que se manda al oyente cuando ocurre el evento. – constructores: Button() y Button(String s) con la etiqueta s como parámetro. – etiqueta: setLabel(String s) y String getLabel() cambia y consulta la etiqueta. – nombre del comando del evento Action: setActionCommand(String s) y String getActionCommand() cambia y consulta el nombre del evento Action que se genera al apretar el botón. Este nombre puede ser consultado a través del objeto ActionEvent correspondiente. Los eventos en java.awt están agrupados en grupos representados por XXX. Cada grupo XXX es soportado por algunos (no siempre todos) de los tipos de componentes. Las XXXListener son interfaces que incluyen una o más signaturas de operaciones que todo oyente debe soportar. Programación Orientada a Objetos – DCIC UNS – 2002 300 Programación Orientada a Objetos – DCIC UNS – 2002 302 Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple (cont.) • clase Checkbox Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple (cont.) • clase Label – constructores: Checkbox(), Checkbox(String s), Checkbox(String s, boolean b), Checkbox(String s, boolean b, CheckboxGroup g) con la etiqueta s, el estado inicial b y el grupo g como parámetros. En el caso de usar un grupo para implementar una dependencia entre varios checkboxes, recordar que la clase CheckboxGroup no es un componente y que conviene insertarlo dentro de un objeto Panel. – grupo: un grupo permite asociar varios checkboxes de forma que a lo sumo uno esté seleccionado en todo momento. setCheckboxGroup(CheckboxGroup g) y CheckboxGroup getCheckboxGroup() cambia y consulta el grupo al que pertenece un checkbox. Programación Orientada a Objetos – DCIC UNS – 2002 303 – constructores: Label(), Label(String s), Label(String s, int i) con la etiqueta s y la constante de alineación i como parámetros. static final int CENTER final int LEFT – constantes de alineación: static static final int RIGHT – alineación: setAlignment(int i) y int getAlignment() consulta y cambia la alineación. Tanto el parámetro i como el resultado deben ser alguna de las constantes anteriores. – texto: setText(String s) y String getText() consulta y cambia el texto de la etiqueta. Programación Orientada a Objetos – DCIC UNS – 2002 Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple (cont.) – etiqueta: setLabel(String s) y String getLabel() cambia y consulta la etiqueta. – estado: setState(boolean b) y boolean getState() cambia y consulta el estado del componente. La clase CheckboxGroup tiene un constructor trivial ChecboxGroup(), e implementa las operaciones para cambiar y consultar cuál de sus checkboxes está seleccionado: setSelectedCheckbox(Checkbox c) y Checkbox getSelectedCheckbox() respectivamente. Programación Orientada a Objetos – DCIC UNS – 2002 304 305 Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple (cont.) • clase List – constructores: List(), List(int i), List(int i, boolean b) con la cantidad de lı́neas visibles i y el seteo de selección múltiple b. – manejo de items: addItem(String s), addItem(String s, int i) agrega un nuevo ı́tem s al final de la lista o en la posición i. remove(int i) y remove(String s) eliminan un ı́tem de la lista. String getItem(int i) y int getItem(String s) consultan un ı́tem especı́fico de la lista. String[] getItems() devuelve todos los elementos de la lista. int getItemCount() devuelve la cantidad de elementos. replaceItem(String s, int i) reemplaza el ı́tem en la posición i. – visibilidad: int getVisibleIndex() retorna el último ı́ndice de un elemento visible. makeVisible(int i) hace que un determinado elemento sea visible. Programación Orientada a Objetos – DCIC UNS – 2002 306 Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple (cont.) – modo de selección múltiple: setMultipleMode(boolean b) y boolean isMultipleMode() cambia y consulta el modo de selección múltiple. – manejo de selección: int getSelectedItem() y String getSelectedItem() consultan el ı́tem seleccionado con modo de selección simple. int[] getSelectedItems() y String[] getSelectedItems() consultan todos los ı́tems seleccionados con modo de selección múltiple. boolean isIndexSelected(int i) consulta si un ı́tem está seleccionado. Programación Orientada a Objetos – DCIC UNS – 2002 307 Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple (cont.) • clase TextField – constructores: TextField(), TextField(String s), TextField(int i), TextField(String s, int i) con la cadena inicial s y cantidad de columnas i como parámetros. – tamaño: setColumns(int i) y int getColumns() cambia y consulta la cantidad de columnas del campo. – caracter de eco: setEchoChar(char c) y char getEchoChar() cambia y consulta el caracter de eco del texto ingresado. En caso en que este caracter esté seteado, cada caracter entrado sólo se visualiza con un caracter de echo. Esta condición se consulta con boolean echoCharIsSet(). Programación Orientada a Objetos – DCIC UNS – 2002 Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple (cont.) • clase TextComponent 309 Jerarquı́a de Componentes Funcionalidad especı́fica de cada componente simple (cont.) • clase TextArea – texto normal: setText(String s) y String getText() cambia y consulta el texto. – texto seleccionado: String getSelectedText() consulta el texto actualmente seleccionado. select(int i, int j), setSelectionStart(int i) y setSelectionEnd(int i) modifican el texto actualmente seleccionado. selectAll() selecciona todo el texto. – edición: setEditable(boolean b) y boolean isEditable() cambia y consulta la posibilidad de edición del texto del componente. – cursor: setCaretPosition(int i) y int getCaretPosition() cambia y consulta la posición del cursor interno dentro del texto. Programación Orientada a Objetos – DCIC UNS – 2002 308 – constructores: TextArea(), TextArea(int x, int y), TextArea(String s), TextArea(String s, int x, int y) con la cadena inicial s, cantidad de columnas x y cantidad de filas y. – texto: append(String s) agrega el texto s al final del texto existente. replace(String s, int i, int j) reemplaza los caracteres desde la posición i hasta la j por la cadena s. insert(String s, int i) inserta la cadena s en la posición i – tamaño: setColumns(int i) y int getColumns() cambia y consulta la cantidad de columnas visibles del texto. setRows(int i) y int getRows() cambia y consulta la cantidad de filas visibles del texto. Programación Orientada a Objetos – DCIC UNS – 2002 310 Jerarquı́a de Componentes Funcionalidad general de la clase Container La clase Container es la encargada de implementar las operaciones para el manejo de varios componentes a la vez. Estos componentes se pueden insertar en un contenedor ya sea a través de un ı́ndice o de un nombre representado por una cadena. • agregar componentes: add(Component c), add(Component c, int i), add(String s, Component c) incorporan al contenedor un nuevo componente c, ya sea bajo un ı́ndice i o un nombre s. • consulta de componentes: Component getComponent(int i) y Component getComponent(String s) consulta un componente porı́ndice o nombre. Component getComponentAt(int x,int y) consultan el componente que ocupa la posición relativa determinada por la columna x y fila y. Component[] getComponents() devuelve todos los componentes del contenedor. Programación Orientada a Objetos – DCIC UNS – 2002 311 312 Jerarquı́a de Componentes Funcionalidad especı́fica de los descendientes de Container • clase Window – foco: toBack() y toFront() cambian el foco entre todas las ventanas del sistema. Component getFocusOwner() consulta el componente de la ventana que ostenta el foco interno. – finalización: dispose() elimina el objeto Window, que no es recolectado automáticamente por el garbage collector sino hasta después de recibir este mensaje. – visualización: show() muestra el objeto en la pantalla, dado que no es muestrado automáticamente después de la creación. boolean isShowing() consulta este estado. pack() visualiza la ventana con el tamaño óptimo, de acuerdo a los componentes que contenga. Programación Orientada a Objetos – DCIC UNS – 2002 Jerarquı́a de Componentes Funcionalidad general de la clase Container (cont.) • eliminación de componentes: remove(Component c) y remove(int i) eliminan un componente contenido. La operación removeAll() elimina todos los componentes contenidos. • visualización relativa: doLayout() realiza la visualización de todos los componentes que contiene de acuerdo a la polı́tica seteada. setLayout(LayoutManager l) y LayoutManager getLayout() cambia y consulta la polı́tica de visualización de los contenidos. La clase LayoutManager es una clase abstracta de la cual heredan en java.awt varias clases tales como FlowLayout, BorderLayout, CardLayout, GridLayout. Cada una de estas clases implementa una polı́tica diferente para visualizar un conjunto de componentes. Esta polı́tica es la encargada de cambiar automáticamente la visualización en el caso de que se modifique el área de pantalla del contenedor. Programación Orientada a Objetos – DCIC UNS – 2002 313 Jerarquı́a de Componentes Funcionalidad especı́fica de los descendientes de Container (cont.) • clase Frame – constructores: Frame() y Frame(String s) con el tı́tulo s como parámetros. – tı́tulo: setTitle(String s) y String getTitle() cambia y consulta el tı́tulo de la ventana. – ı́cono: setIconImage(Image i) y Image getIconImage() cambia y consulta elı́cono de minimización de la ventana. – menúes: setMenuBar(MenuBar b) y MenuBar getMenuBar() cambia y consulta la barra de menúes de la ventana. La clase MenuBar también está implementada en java.awt. Programación Orientada a Objetos – DCIC UNS – 2002 314 Jerarquı́a de Componentes Funcionalidad especı́fica de los descendientes de Container (cont.) • clase Dialog – constructores: Dialog(Frame f), Dialog(Frame f,String s), Dialog(Frame f, boolean b) y Dialog(Frame f, String s, boolean b) con la ventana padre f, tı́tulo s y modalidad b como parámetros. – modalidad: un diálogo es modal sin no puede perder el foco ante su padre. setModal(boolean b) y boolean isModal() cambia y consulta el estado de modalidad. – tı́tulo: setTitle(String s) y String getTitle() cambia y consulta el tı́tulo de la ventana. Jerarquı́a de Componentes Layouts • toda instancia de la clase Container muestra los componentes que contiene en una posición absoluta, que no depende del tamaño de pantalla disponible. • esta posición absoluta se especifica en base a coordenadas cuya unidad de medida es el pixel, y que se calculan a partir del extremo superior izquierdo. • esto no es conveniente para la mayorı́a de los GUI’s, especialmente para aquellas generadas por Applets, donde no se saben las caracterı́sticas de la plataforma en la que se ejecutan. • es conveniente entonces implementar una visualización relativa de los elementos dentro del contender. Programación Orientada a Objetos – DCIC UNS – 2002 315 Programación Orientada a Objetos – DCIC UNS – 2002 Jerarquı́a de Componentes Funcionalidad especı́fica de los descendientes de Container (cont.) • clase Panel Es el contenedor más simple. No proporciona ningún comportamiento especı́fico, pero implementa en forma simple todas las operaciones abstractas de Container. Se usa para representar lógicamente partes de una ventana. 317 Jerarquı́a de Componentes Layouts (cont.) • para cambiar este comportamiento, se asocia al contenedor un objeto manejador de layout, que se activará cada vez que tiene que cambiar de apariencia. • este objeto será el encargado de recalcular los nuevos tamaños y posiciones para cada uno de sus componentes. • la asociación entre un contenedor y un layout se hace con el comando void setLayout(LayoutManager l). • se puede forzar a un contenedor al recálculo su visualización mediante el comando void validate(). Programación Orientada a Objetos – DCIC UNS – 2002 316 Programación Orientada a Objetos – DCIC UNS – 2002 318 Jerarquı́a de Componentes Layouts (cont.) Jerarquı́a de Componentes FlowLayout • es el manjedor de layout estandar para todas las instancias de Panel. • el paquete java.awt incluye varias clases que implementan la interface LayoutManager, cada una de las cuales implementa una polı́tica distinta para este recálculo. • funciona simplemente agregando componentes por fila, de izquierda a derecha, comenzando una nueva fila si es necesario. BorderLayout FlowLayout LayoutManager GridLayout CardLayout GridBagLayout • dentro de cada fila los componentes se muestran centrados. Se puede cambiar esto mediante un parámetro en el constructor, usando las constantes FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT. • en el caso de alineaciones a izquierda o derecha, se puede indicar una separación estándar entre componentes mediante el constructor FlowLayout(int alin, int espacioH, int espacioV). Programación Orientada a Objetos – DCIC UNS – 2002 319 Programación Orientada a Objetos – DCIC UNS – 2002 Jerarquı́a de Componentes 321 Jerarquı́a de Componentes BorderLayout • es el manejador de layout estándar de todas las instancias de Frame y Dialog. • define cinco lugares estándar para incluir componentes: Norte, Sur, Este, Oeste y Centro. • se reparte todo el espacio disponible para el contenedor entre estos lugares. Un cambio a lo ancho modifica los sectores Norte, Centro y Sur. Un cambio a lo alto modifica los sectores Este, Centro y Oeste. • cada contenedor debe recibir sus componentes con la indicación del lugar deseado: add(String s, Component c) donde s puede ser ”North”, ”South”, ”East”, ”West” or ”Center”. • por default, no se reserva espacio entre estos lugares. Se puede indicar una separación mediante el constructor public BorderLayout(int espacioH, int espacioV). Programación Orientada a Objetos – DCIC UNS – 2002 320 GridLayout • se usa cuando se disponen de un conjunto de componentes de igual tamaño, se muestran por filas y columnas. • el constructor debe indicar las cantidades de filas y columnas máximas GridLayout(int f, int c). Un valor 0 indica cantidad arbitraria de filas, o de columnas. • también se puede especificar un espacio de separación estándar, usando el constuctor GridLayout(int f, int c, int espacioH, int espacioV). • la incorporación de componentes al contenedor se hace en orden de flujo, o con una coordenada especificada. Programación Orientada a Objetos – DCIC UNS – 2002 322 Jerarquı́a de Componentes Jerarquı́a de Componentes ¿Cómo elegir un manejador de layout? CardLayout • este manejador de layout se usa cuando se quiere compartir un espacio entre varios componentes que no se muestran todos a la vez. • la incorporación al componente se hace mediante add(String n, Component c), que especifica un nombre para cambiar la visualización. • los siguientes comandos sobre el manejador de layout permiten especificar cuál componente se visualiza: – void – void – void – void – void • tratar de usar siempre el manejador de layout más simple. • si se trata de varios elementos del mismo tipo, entonces usar una grilla. • si ningún manejador de layout nos sirve, considerar la división del contenedor en paneles internos, cada uno con un manejador de layout distinto. first(Container p) next(Container p) previous(Container p) last(Container p) show(Container p, String n) Programación Orientada a Objetos – DCIC UNS – 2002 323 Jerarquı́a de Componentes Programación Orientada a Objetos – DCIC UNS – 2002 325 Jerarquı́a de Componentes Menues GridBagLayout • se debe crear primero una instancia de MenuBar, que contendrá una serie de menues. La asociación con la ventana se hace mediante el comando setMenuBar(MenuBar mb) • permite crear una disposición en filas y columnas como el GridLayout, pero con ancho y altura variable, y cada componente puede ocupar más de una celda. • los menues asociados a una ventana se manejan en forma independiente que el resto de los componentes. No son descendientes de la clase Component. • es el manejador de layout más flexible, pero el más difı́cil de usar. • al objeto de tipo MenuBar se le pueden incluir distintos objetos menúes, instancias de Menu con su etiqueta y tecla abreviada. • cada menú puede incluir objetos de tipo MenuItem, CheckboxMenuItem u otros menúes, formando una estructura de tipo árbol. • los MenuItem o CheckboxMenuItem pueden responder a eventos de tipo acción. Programación Orientada a Objetos – DCIC UNS – 2002 324 Programación Orientada a Objetos – DCIC UNS – 2002 326 Jerarquı́a de Componentes Jerarquı́a de Componentes Gráficos y Texto • cada vez que una GUI necesita dibujarse, ya sea por primera vez, o porque debe reflejar un cambio interno del programa, comienza el proceso con el componente más alto en la jerarquı́a de contenedores, bajando recursivamente hacia los componentes simples. • ya sea para dibujar, o para posicionar otros componentes en forma absoluta, cada componente tiene sus propias coordenadas. En éstas, el eje X aumenta a derecha y el eje Y aumenta hacia abajo. Gráficos y Texto (cont.) • la implementación estándar del comando void update(Graphics g) simplemente dibuja el área del componente con el color de fondo (borrando todo lo que antes existı́a), y llama al comando void paint(Graphics g). • la implementación estándar de void paint(Graphics g) no hace nada. Si se quiere cambiar este comportamiento entonces es necesario redefinirlo en nuestras propias clases. • redefinir void paint(Graphics g) funciona bien si el componente no cambia frecuentemente. En caso contrario es necesario redefinir tanto el void update(Graphics g) como el void paint(Graphics g). Programación Orientada a Objetos – DCIC UNS – 2002 327 Jerarquı́a de Componentes Gráficos y Texto (cont.) Programación Orientada a Objetos – DCIC UNS – 2002 329 Jerarquı́a de Componentes Gráficos y Texto (cont.) • el comando general para indicar a un componente que se dibuje es void repaint(), perteneciente a la clase Component. • su implementación estándar se encarga de asegurar que el proceso de dibujar el componente se pueda realizar sin interrupción, lo más pronto posible. A continuación, invoca al comando void update(Graphics g) sobre el mismo componente. • el parámetro de tanto void update(Graphics g) como void paint(Graphics g) es un objeto que representa el contexto particular sobre el cual el componente se dibuja. • la función de la clase Graphics incluye métodos para: – dibujar rectángulos, lı́neas, arcos, polı́gonos, etc. – escribir texto cambiando el color, el tipo y tamaño de la letra – dibujar imágenes, estáticas o con animación. • existen otras variantes del comando repaint: – void repaint(long t) requiere que el componente se dibuje dentro de a lo sumo t milisegundos. – void repaint(int x, int y, int ancho, int alto) requiere que se redibuje sólo el área dentro del rectángulo especificado Programación Orientada a Objetos – DCIC UNS – 2002 328 • además, la clase Graphics también provee métodos para mantener el estado actual del proceso, tal como el área y el color para todos los dibujos que se están realizando. Programación Orientada a Objetos – DCIC UNS – 2002 330 Jerarquı́a de Componentes Gráficos y Texto (cont.) • la clase Graphics tiene comandos para dibujar: – lı́neas: mediante void drawLine(...) – rectángulos: mediante void drawRect(...), al igual que void fillRect(...), y void clearRect(...) – rectángulos resaltados: mediante draw3DRect(...) y void fill3DRect(...) – rectángulos con bordes redondeados: mediante void drawRoundRect(...) y void fillRoundRect(...) – óvalos: mediante void drawOval(...) y void fillOval(...) – secciones de arcos: mediante void drawArc(...) y void fillArc(...) – polı́gonos: mediante void drawPolygon(...) y void fillPolygon(...) Jerarquı́a de Componentes Gráficos y Texto (cont.) • para escribir el texto, la clase Graphics provee la operación void drawString(String s, int x, int y) donde (x,y) es la esquina inferior izquierda del rectángulo para el texto (sin contar las letras que bajan), y s es la cadena a escribir. • la clase FontMetrics provee todos los detalles sobre el tamaño del texto a dibujar. • todo objeto instancia de Graphics tiene un atributo de tipo FontMetrics que puede recibir comandos para cambiar esos valores. • la clase Font provee todos los detalles sobre la tipografı́a del texto a dibujar. • todo objeto instancia de Graphics tiene un atributo de tipo Font que puede cambiarse para usar distinto tipo de letra. Este objeto debe crearse en forma independiente. Programación Orientada a Objetos – DCIC UNS – 2002 331 Jerarquı́a de Componentes Gráficos y Texto (cont.) Programación Orientada a Objetos – DCIC UNS – 2002 333 Jerarquı́a de Componentes Gráficos y Texto (cont.) • excepto por lı́neas, polı́gonos y arcos, todas las demás figuras son especificadas por el rectángulo en el que se inscriben. • las lı́neas se especifican con los dos puntos extremos, y los polı́gonos con un objeto de tipo Polygon, que permite agregarle o sacarle puntos. • los arcos necesitan, además del rectángulo, los ángulos iniciales y finales. • otras clases útiles para manejar texto se encuentran en el paquete java.text. • permiten formatear objetos estándares, como las instancias de Date, Time o Number, y transformarlo en cadenas con caracterı́sticas fijas, mediante la operación format(...). • también permiten el proceso inverso, dada una cadena se puede crear un objeto de tipo Date, Time o Number. Este proceso se denomina parsing. • el parsing se realiza con la operación parse(String s), donde el objeto receptor puede ser de clase DateFormat o NumberFormat. Programación Orientada a Objetos – DCIC UNS – 2002 332 Programación Orientada a Objetos – DCIC UNS – 2002 334 Jerarquı́a de Componentes Gráficos y Texto (cont.) • para formatear números, por ejemplo, ... DecimalFormat f = new DecimalFormat("#,##0.##;(#,##0.##)"); String s = f.format(-1234.567899); System.out.println(s); ... Jerarquı́a de Componentes Gráficos y Texto (cont.) • la clase Graphics también permite dibujar imágenes. Pero antes es necesario tener creado el objeto imágen, de tipo Image. • esto se hace especificando el archivo o la dirección URL de dónde debe cargarse. Hay que tener en cuenta en el primer caso los permisos disponibles. resulta en (1.234,56) en una máquina configurada en español. • para parsear números, por ejemplo ... DecimalFormat f = new DecimalFormat("#,##0.##;(#,##0.##)"); String s = " -12.45667 "; Number numero = f.parse(s, new ParsePosition(0)); ... Programación Orientada a Objetos – DCIC UNS – 2002 335 Jerarquı́a de Componentes Gráficos y Texto (cont.) Programación Orientada a Objetos – DCIC UNS – 2002 337 Jerarquı́a de Componentes Gráficos y Texto (cont.) • para fechas, por ejemplo, • las operaciones de la clase Graphics para imágenes son: ... DateFormat df = DateFormat.getInstance(DateFormat.LONG); String s = df.format(new Date()); System.out.println(s); ... resulta en 7 de Noviembre de 2002 en una máquina configurada en español, o November 7, 2002 en una máquina configurada en inglés. – boolean drawImage(Image img, – boolean drawImage(Image img, ImageObserver observer) – boolean drawImage(Image img, observer) – boolean drawImage(Image img, Color bgcolor, ImageObserver int x, int y, ImageObserver observer) int x, int y, int width, int height, int x, int y, Color bgcolor, ImageObserve int x, int y, int width, int height, observer) • el objeto instancia de ImageObserver puede usarse para indicar quién es el encargado de actualizar esa imagen. Se usa para manejar animaciones. Programación Orientada a Objetos – DCIC UNS – 2002 336 Programación Orientada a Objetos – DCIC UNS – 2002 338 Paquete javax.swing • el paquete javax.swing, introducido en 1998, mejora y extiende las caracterı́sticas del java.awt. La ventaja principal es que sus componentes son livianos (implementados sin depender de código nativo). • contiene definición de nuevos componentes, más la actualización de los anteriores (JButton, JFrame, etc). Paquete javax.swing • permite incorporar tecnologı́a de accesibilidad asistida (dispositivos de entrada/salida no tradicionales). • incluye la posibilidad de definir gráficos de alta calidad mediante java.awt.Graphics2D. • soporta definición de estilos “look and feel”. look & feel JAVA • incluye la posibilidad de realizar operaciones drag & drop entre Java y aplicaciones nativas. • JButton y JLabel pueden mostrar imágenes además de texto. • se pueden agregar distintos tipos de bordes a todos los componentes. Programación Orientada a Objetos – DCIC UNS – 2002 339 Programación Orientada a Objetos – DCIC UNS – 2002 Paquete javax.swing 341 Paquete javax.swing look & feel MOTIF • otra caracterı́stica interesante de este paquete es que permite a ciertos componentes usar modelos para mantener su estado. • a diferencia de java.awt, los componentes no se agregan directamente a un objeto de tipo Frame sino que se incorporan a un panel que está contenido en el JFrame, llamado content pane. Éste objeto es el que contiene un layout y responde a los eventos de tipo contenedor. look & feel WINDOWS Programación Orientada a Objetos – DCIC UNS – 2002 340 Programación Orientada a Objetos – DCIC UNS – 2002 342 Paquete javax.swing Uso de componentes Swing 1. importar el paquete completo, o sólo las clases necesarias. A veces es necesario importar clases del paquete java.awt: import javax.swing.*; import java.awt.*; import java.awt.event.*; ... 2. especificar el look & feel que el programa usará, generalmente en el comienzo de la ejecución: public static void main(String[] argumentos) { try { UIManager.setLookAndFeel(...); } catch (Exception e) { } ... Paquete javax.swing 4. inicializar los componentes de la GUI, por ejemplo una etiqueta y un botón: ... JButton boton = new JButton("Aceptar"); boton.setActionListener(...); JLabel etiqueta = new JLabel("Texto"); ... 5. agregar los componentes a un contenedor, fijando posiblemente bordes: ... JPanel contenidos = new JPanel(); contenidos.setBorder( BorderFactory.createEmptyBorder(30,30,10,30)); contenidos.setLayout(new GridLayout(0,1)); contenidos.add(boton); contenidos.add(etiqueta); ... 6. finalmente, agregar manejador de eventos y otras decoraciones según sean necesarias. Programación Orientada a Objetos – DCIC UNS – 2002 343 Paquete javax.swing 3. toda GUI implementada a partir de swing debe estar contenida en un contenedor de alto nivel: una instancia de JFrame, JDialog, o JApplet. Estos contenedores proveen el soporte básico para que los componentes se dibujen y manejen eventos. public class MiAplicacion { ... public static void main(String[] argumentos) { ... JFrame ventanaInicial = new JFrame("Mi Aplicacion"); // inicializar componentes en ventanaInicial en // un panel "contenidos" ventanaInicial.getContentPane(). add(contenidos, BorderLayout.CENTER); ventanaInicial.addWindowListener(...); ventanaInicial.pack(); ventanaInicial.setVisible(true); Programación Orientada a Objetos – DCIC UNS – 2002 345 Paquete javax.swing Componentes Swing • Contenedores de Alto Nivel • Contenedores de Propósito General • Contenedores Especı́ficos • Controles Básicos • Controles no-editables para Mostrar de Información } } • Controles para Edición de Información Formateada Programación Orientada a Objetos – DCIC UNS – 2002 344 Programación Orientada a Objetos – DCIC UNS – 2002 346 Paquete javax.swing Contenedores de Alto Nivel Son los componentes en la raı́z de toda jerarquı́a de contenidos de una GUI swing. Paquete javax.swing Contenedores de Propósito General (cont.) • JSplitPane • JFrame • JTabbedPane • JDialog • JApplet Programación Orientada a Objetos – DCIC UNS – 2002 347 Programación Orientada a Objetos – DCIC UNS – 2002 Paquete javax.swing Contenedores de Propósito General Son contenedores intermedios que puede ser usados bajo muy diversas circunstancias. 349 Paquete javax.swing Contenedores de Propósito General (cont.) • JToolbar • JPanel • JScrollPane Programación Orientada a Objetos – DCIC UNS – 2002 348 Programación Orientada a Objetos – DCIC UNS – 2002 350 Paquete javax.swing Contenedores Especı́ficos Son contenedores intermedios que cumplen un papel especı́fico en la GUI. • JInternalFrame Paquete javax.swing Controles Básicos Son componentes atómicos que existen principalmente para obtener entrada por parte del usuario. Generalmente, mantienen un estado interno. • JAbstractButton • JComboBox • JLayeredFrame Programación Orientada a Objetos – DCIC UNS – 2002 351 Programación Orientada a Objetos – DCIC UNS – 2002 Paquete javax.swing 353 Paquete javax.swing • JList • JRootPane Controles Básicos (cont.) Contenedores Especı́ficos (cont.) • JMenu Programación Orientada a Objetos – DCIC UNS – 2002 352 Programación Orientada a Objetos – DCIC UNS – 2002 354 Paquete javax.swing Controles Básicos (cont.) • JSlider Paquete javax.swing Controles para Edición de Información Formateada Son componentes atómicos que muestran información altamente formateada y que (si se lo desea) permiten que el usuario la edite. • JColorChooser • JTextField Programación Orientada a Objetos – DCIC UNS – 2002 355 Programación Orientada a Objetos – DCIC UNS – 2002 Paquete javax.swing Controles no-editables para Mostrar Información Son componentes atómicos que solamente existen para mostrar información al usuario. 357 Paquete javax.swing Controles para Edición de Información Formateada • JFileChooser • JLabel • JProgressBar • JTable • JToolTip Programación Orientada a Objetos – DCIC UNS – 2002 356 Programación Orientada a Objetos – DCIC UNS – 2002 358 Paquete javax.swing Controles para Edición de Información Formateada • JTextArea • JTree Programación Orientada a Objetos – DCIC UNS – 2002 359