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