Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Test Area
Test Area
Proporcionan parte del cdigo Ayudan a organizar/estructurar el cdigo escrito por el programador
Limitan (condicionan) las caractersticas de las interfaces que se pueden desarrollar Alternativa: pintar en la pantalla, seguir movimiento e input del ratn
POO - EPS - UAM 3
Interfaz al sistema operativo Librera para el desarrollo de interfaces grficas Bajo nivel, mxima expresividad, dificultad de uso
Libreras de objetos: Java AWT, Swing, Microsoft MFC, Borland OWL, etc.
Facilidad de desarrollo
ejecuta
Main
termina
f(arg)
pregunta / respuesta
g()
Despachador
mensajes
Componentes de la interfaz
11
Usuario
Ventana
Ventanas
rea rectangular de la pantalla en la que tiene lugar una interaccin (intercambio de input y output) con el usuario Recibe input del usuario (ratn y teclado), muestra output por intermedio del sistema de ventanas, mediante envo de mensajes Ventana marco: ventana principal asociada a una aplicacin Ventanas hijas: subreas que procesan sus propios eventos
POO - EPS - UAM 13
14
Resultado...
15
Invocacin a mtodo Las componentes son objetos A cada tipo de evento corresponde un mtodo de la componente La respuesta a eventos se define implementando mtodos
Componentes AWT
16
Mantiene un dibujo en la pantalla Depende del estado: controlar la apariencia a travs del estado
17
Objetos grficos
Presentacin en la pantalla Objetos del programa
18
Componentes predefinidas Agregacin de componentes Las interfaces se dibujan a s mismas: funciones de dibujo Creacin de nuevas componentes Emisin de eventos Recepcin y procesamiento de eventos
Layout de componentes
POO - EPS - UAM 20
10
La clase Container, adicin de subcomponentes Control de la apariencia de las componentes manipulando su estado Posiciones absolutas Layout managers Eventos de accin generados por las clases predefinidas Gestin directa del input del usuario La clase Canvas Utilizacin de las funciones de dibujo
POO - EPS - UAM 21
22
11
Componentes predefinidas
Label TextField Button TextArea
Frame
23
24
12
Aspectos interactivos
Editar texto del campo Cerrar ventana
Leer el fichero indicado en el campo de texto, asignar como string del rea de texto Escribir string del rea de texto en el fichero indicado en el campo de texto Editar texto multilnea
POO - EPS - UAM 25
13
28
14
30
15
Resumen
Programar un IU para una aplicacin en Java involucra:
Composicin Layout Eventos Paint
31
16
33
34
17
35
36
18
Clases en el ejemplo
Frame Converter
Creacin de la ventana
public void init() { // Use a GridLayout with 2 rows, as many columns as necessary, // and 5 pixels of padding around all edges of each cell. setLayout(new GridLayout(2,0,5,5)); ....
38
19
funcionalidad
20
Dibujo
41
Main
//Add the Converter to the window and display the window. f.add("Center", converter); f.pack(); //Resizes the window to its natural size. f.setVisible(true); } }
POO - EPS - UAM 42
21
Panel interno
43
Composicin
//Add the label. It displays this panel's title, centered. Label label = new Label(myTitle, Label.CENTER); c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row. gridbag.setConstraints(label, c); add(label);
POO - EPS - UAM 44
22
+ componentes
45
+ componentes
unitChooser = new Choice(); for (int i = 0; i < units.length; i++) { //Populate it. unitChooser.add(units[i].description); } c.weightx = 0.0; //The default value. c.gridwidth = GridBagConstraints.REMAINDER; //End a row. gridbag.setConstraints(unitChooser, c); add(unitChooser); unitChooser.addItemListener(this);
46
23
+ componentes
47
Dibujo
/** * Puts a little breathing space between the panel * and its contents, which lets us draw a box in the paint() method. */ public Insets getInsets() { return new Insets(5,5,5,8); }
48
24
Respuesta a eventos
Modificacin componentes
25
Jerarqua = Composicin Las componentes son estructuradas en una jerarqua de componentes, con instancias de (subclases de) Container definiendo dicha estructura. Los componentes son dibujados desde el tope de la jerarqua (la Ventana) hacia abajo, hasta arribar a las hojas (componentes no contenedores) Los eventos son enviados a los objetos que se registran como event listeners Modelo de delegacin
POO - EPS - UAM 51
Manejo de eventos:
Las ventanas no pueden aadirse a otra componente La colocacin de las componentes en un contenedor se puede definir:
26
En el constructor del contenedor En main En cualquier funcin Acceso a componentes: getComponent(int), getComponentAt(int,int), getComponentCount(), getComponents() Acceso al contenedor desde una componente: getParent()
POO - EPS - UAM 53
54
27
Normalmente no se redefine paint de las clases predefinidas Para modificar su apariencia, modificar su estado (el sistema refleja los cambios en la pantalla automticamente) En componentes personalizadas desde cero s se define paint Utilizar hilos si es necesario para no bloquear el repintado
POO - EPS - UAM 55
Dibujo de componentes
El dibujo comienza por el componente ms alto en la jerarqua que necesita ser dibujado
Se baja por la jerarqua, dibujando cada componente intermedio, hasta las hojas. El sistema de dibujo de AWT organiza este procedimiento No se pueden hacer suposiciones sobre el orden relativo de dibujo de las componentes
POO - EPS - UAM 56
28
Los componentes de este panel (Label, TextField, Scrollbar y Choice) son dibujados
POO - EPS - UAM 57
Cundo
Al desplegar una ventana o cambiarle el tamao Al hacer visible un componente Al cambiar desde el programa propiedades visuales de un componente Al ser necesario cambiar la apariencia de uno componente para reflejar cambios en la aplicacin En los tres primeros casos, el sistema AWT. En el ltimo caso, el mismo programa
POO - EPS - UAM 58
Quin solicita
29
invoca a update(Graphics) Esta invocacin se hace desde el hilo de procesamiento de eventos update(Graphics) borra el rea a refrescar e invoca a paint(Graphics) invoca a repaint() Peticin al sistema AWT para llamar a update lo antes posible El programa no debe llamar a paint directamente
POO - EPS - UAM 60
Lo solicita el programa
30
Normalmente nos llega a nuestro cdigo desde AWT Dibujar y rellenar rectngulos, arcos, lneas, valos, polgonos, textos e imgenes. Obtener o cambiar el color, tipo de fuente o rea de clipping actuales. Cambiar el modo de dibujo.
61
62
31
De
Gestin de eventos
Los eventos son objetos de distintas subclases de AWTEvent Se generan eventos cuando:
Se produce input del usuario: MouseEvent,KeyEvent Un widget se acciona: ActionEvent, TextEvent, AdjustmentEvent Una ventana es manipulada: WindowEvent Otras causas: ContainerEvent, ComponentEvent, PaintEvent, etc.
32
Estructura de programa
En cada programa con un manejador de eventos:
1. En el encabezamiento de la clase, declaracin de implementar la interfaz (o extender una clase que la implemente):
2.
Cdigo que registra una instancia del manejador como receptor de eventos de uno o ms emisores:
someComponent.addActionListener(instanceOfMyClass);
3.
65
Ejemplo visto
class ConversionPanel extends Panel implements ActionListener, AdjustmentListener, ItemListener { textField.addActionListener(this);
33
java.awt.Component
Dibujarse en la pantalla: paint(), update(), repaint() Procesamiento de eventos: delegacin Control de la apariencia visual:
Color: setForeground(Color), getForeground(), setBackground(Color), getBackground() Font: setFont(Font), getFont() Cursor: setCursor(Cursor), getCursor()
68
34
java.awt.Component (II)
Tamao y posicin:
setSize(int,int) getSize() Dimension getLocation() Point getLocationOnScreen() Point setBounds(int,int,int,int) getBounds() Rectangle
java.awt.Graphics
Argumento de paint() y update() Dibujo de primitivas grficas:
Estado:
Componente sobre la que dibujar: getGraphics() de Component Origen de coordenadas: translate(int,int) rea de clip: getClip(), setClip(int,int,int,int) Color: setColor(Color), getColor() Font: setFont(Font), getFont() Modo XOR: setXORMode(Color)
POO - EPS - UAM 70
35
Dimension: width, height Point: x, y Rectangle: x, y, width, height, contains(Point) Polygon: npoints, xpoints, ypoints, addPoint(Point) new Color(0.8f, 0.3f, 1.0f) en RGB Constantes de tipo Color: Color.white,Color.blue, etc. Funciones para conversin RGB HSB
POO - EPS - UAM 71
Color:
new Font ("Helvetica", Font.BOLD + Font.ITALIC, 18) getName(), getStyle(), getSize() Constantes de estilo: Font.BOLD, Font.ITALIC, Font.PLAIN new Cursor(Cursor.HAND_CURSOR) Cursor.CROSSHAIR_CURSOR etc.
POO - EPS - UAM 72
Cursor:
36
Modelo de eventos
Modelo basado en delegacin. A cada tipo de evento xxxEvent corresponde:
Un tipo de receptor xxxListener (excepcin: MouseEvent tiene dos) Una lista de clases de componentes que pueden producir el evento Un mtodo addxxxListener para registrar receptores de esos eventos
Este mtodo est definido en las clases que generan el evento Una componente slo puede registrar listeners del tipo de eventos que genera la componente
POO - EPS - UAM 74
37
Una componente slo puede registrar listeners del tipo de eventos que genera la componente
POO - EPS - UAM 75
76
38
77
78
39
Utilizacin de adapters
Este tipo de cdigo resulta ms difcil de leer y mantener. Para evitar la implementacin vaca de mtodos, AWT provee clases adapters
implementan listeners con mtodos vacos; proporciona los adaptadores en java.awt.event; para cada interfaz de listener con ms de un mtodo.
Crear una subclase del adaptador definiendo slo los mtodos que interesen
POO - EPS - UAM 79
public class MyClass extends MouseAdapter { ... someObject.addMouseListener(this); ... public void mouseClicked(MouseEvent e) { ...//Event handler implementation goes here... } }
POO - EPS - UAM 80
40
81
Adaptadores: cdigo
class MyListener extends MouseAdapter { public void mouseEntered (MouseEvent e) { ... // Respuesta de la ventana al evento } } class Ventana extends Frame { Ventana () { Button boton = new Button (); boton.addMouseListener (new MyListener ()); ... } }
POO - EPS - UAM 82
41
83
42
43
Ver apndice A
Clases de Eventos Mtodos de los listeners
87
44
Cambiar colores, fonts, etiquetas, etc. Mover objetos, cambiar su tamao Ocultar, mostrar, aadir, eliminar componentes Abrir un cuadro de dilogo etc. Normalmente se refleja algn resultado en la interfaz
89
Botones: MouseEvent ActionEvent Widgets de texto: MouseEvent, KeyEvent TextEvent, ActionEvent Widgets de seleccin: MouseEvent ItemEvent, ActionEvent etc.
Eventos de cambio de estado de componentes: procesar los eventos inmediatamente vs. acceder al estado cuando se necesite
45
ID de los distintos eventos de una clase Ejemplo: MouseEvent.MOUSE_MOVED, KeyEvent.KEY_RELEASED Constantes para ciertas propiedades de los eventos (valores devueltos por mtodos) Ejemplo: ItemEvent.SELECTED, ItemEvent.DESELECTED Devuelven informacin adicional sobre el evento Ejemplo: getX(), getY() de MouseEvent, getKeyChar() de KeyEvent, getID() de AWTEvent
POO - EPS - UAM 91
Mtodos
Implementacin de un ActionListener
Probablemente son los ms fciles y comunes de implementar. Se implementa un ActionListener para responder a las indicaciones del usuario de que alguna accin dependiente de la implementacin debe ocurrir. Cundo ocurre?
Click sobre un botn Doble Click sobre un item de lista Elegir un menu item Enter en un campo de texto
Como resultado, se enva el mensaje actionPerformed a todos los listeners que se han registrado para ese componente
POO - EPS - UAM 92
46
Interfaz ActionListener
Define un solo mtodo
void actionPerformed(ActionEvent)
Llamado
por AWT justo despus que el usuario informe a la componente oda que algo debe ocurrir.
93
Ejemplo de ActionListener
94
47
Ejemplo de ActionListener
public class MultiListener ... implements ActionListener { ... //where initialization occurs: button1.addActionListener(this); button2.addActionListener(this); button2.addActionListener(new Eavesdropper(bottomTextArea)); } public void actionPerformed(ActionEvent e) { topTextArea.append(e.getActionCommand() + "\n"); } } class Eavesdropper implements ActionListener { ... public void actionPerformed(ActionEvent e) { myTextArea.append(e.getActionCommand() + "\n"); } }
POO - EPS - UAM 95
Ver apndice B
Implementacin de interfaces de listeners
96
48
Layout de componentes
Qu es layout?
98
49
Layout Manager
Objeto que controla el tamao y posicin de los componentes de un contenedor. Implementan la interfaz LayoutManager Por qu layout managers?
La posicin de una componente depende de las componentes que la rodean y del espacio disponible para el grupo Un layout manager por encima de las componentes individuales impone un orden Las componentes negocian su colocacin y tamao con el layout manager.
POO - EPS - UAM 99
Especficos: Ultra
flexible:GridBagLayout
100
50
setLayoutManager(LayoutManager)
51
Se necesita mostrar una componente en tanto espacio como sea posible. Con BorderLayout, se debe poner la componente vida de espacio en el centro. Con GridBagLayout es necesario que la propiedad fill de las restricciones sea fill=GridBagConstraints.BOTH. Si no importa que las otras componentes sean igual de grandes, se puede usar un GridLayout.
POO - EPS - UAM 103
Considere utilizar un Panel para contener los componentes y el manager por omisin para el Panel, el FlowLayout manager. Escenario:
Es necesario mostrar unos pocos componentes del mismo tamao en filas y/o columnas.
52
Ver apndice C
Clases de layout managers
106
53
Interfaz KeyListener
void keyTyped(KeyEvent)
Llamado por AWT despus que el usuario introduce un carcter Unicode en la componente de inters. Llamado por AWT despus que el usuario presiona una tecla en el teclado. Llamado por AWT despus que el usuario suelta una tecla en el teclado.
void keyPressed(KeyEvent)
void keyReleased(KeyEvent)
107
Clase KeyEvent
int getKeyChar() void setKeyChar(char)
Obtiene o cambia el cdigo de tecla asociado al evento. La clase KeyEvent define varias constantes de cdigos para las teclas comunes. Por ejemplo:
void setModifiers(int)
54
BorderLayout
110
55
BorderLayout (II)
class Ventana extends Frame { Ventana () { setLayout (new BorderLayout ()); setTitle ("Border Layout"); add("North", new Button("North")); add("South", new Button("South")); add("East", new Button("East")); add("West", new Button("West")); add("Center", new Button("Center")); } }
mportante: en este caso, siempre se debe utilizar una I versin de add con dos argumentos:
Sector Componente
POO - EPS - UAM 111
BorderLayout (III)
La parte central es la que ms vara con la ventana. Las otras partes slo varan para mantener ocupado todo el espacio disponible. Manager por omisin de las ventanas. Por omisin, no tiene ninguna distancia al borde
112
56
FlowLayout
113
FlowLayout (II)
Este manager pone las componentes en una fila, cada una a su preferredSize(). Si el espacio horizontal es muy pequeo, agrega nuevas filas. En cada fila los componentes puedan estar centrados (omisin), alineados a izquierda o a derecha.
114
57
FlowLayout (III)
class Ventana extends Frame { Ventana () { setLayout (new FlowLayout ()); setTitle ("Flow Layout"); add (new Button ("Button 1")); add (new Button ("Button 2")); add (new Button ("Button 3")); add (new Button ("Button 4")); add (new Button ("Button 5")); } }
115
FlowLayout (IV)
class Ventana extends Frame { Ventana () { FlowLayout f = new FlowLayout (); f.setAlignment(FlowLayout.RIGHT); setLayout (f); setTitle ("Flow Layout"); add (new Button ("Button 1")); add (new Button ("Button 2")); add (new Button ("Button 3")); add (new Button ("Button 4")); add (new Button ("Button 5")); add (new Button ("Button 6")); } }
POO - EPS - UAM 116
58
FlowLayout (V)
Tres constructores:
public FlowLayout() public FlowLayout(int alignment) public FlowLayout(int alignment, int horizontalGap, int verticalGap)
Alineamiento:
componentes (omisin: 5)
POO - EPS - UAM 117
GridLayout
setRows(int), setColumns(int) GridLayout(0,n) tantas filas como hagan falta Ejemplo: GridLayout(2,3)
118
59
GridLayout (II)
Este manager pone las componentes en una grilla de celdas. Cada componente toma todo el espacio disponible en su celda, las cuales tienes todas el mismo tamao. Cuando se redimensiona una ventana con GridLayout, se cambia el tamao de las celdas de forma que sean lo ms grandes posibles dado el espacio disponible.
POO - EPS - UAM 119
GridLayout (III)
class Ventana extends Frame { Ventana () { setLayout (new GridLayout (2,3)); setTitle ("Grid Layout"); add (new Button ("Button 1")); add (new Button ("Button 2")); add (new Button ("Button 3")); add (new Button ("Button 4")); add (new Button ("Button 5")); } }
Constructores: public GridLayout(int rows, int columns) public GridLayout(int rows, int columns, int horizontalGap, int verticalGap)
POO - EPS - UAM 120
60
CardLayout
121
CardLayout (II)
Un CardLayout permite manipular dos o ms componentes (usualmente Paneles) para que compartan el mismo espacio de la pantalla. Conceptualmente, una pila de cartas donde slo se ve la que est en la cima. Se puede elegir qu carta estar en la cima:
Solicitando la primera o ltima carta (orden en que se agregaron al contenedor). Recorriendo la pila hacia delante o hacia atrs. Especificando una carta por nombre
POO - EPS - UAM 122
61
CardLayout (III)
//Where instance variables are declared: Panel cards; final static String BUTTONPANEL = "Panel with Buttons"; final static String TEXTPANEL = "Panel with TextField"; ... //Where the container is initialized: cards = new Panel(); cards.setLayout(new CardLayout()); ... //Create a Panel named p1. Put buttons in it. //Create a Panel named p2. Put a text field in it. ... cards.add(BUTTONPANEL, p1); cards.add(TEXTPANEL, p2); ... ((CardLayout)cards.getLayout()).show(cards, BUTTONPANEL); // o bien ((CardLayout)cards.getLayout()).show(cards, TEXTPANEL);
POO - EPS - UAM 123
CardLayout (IV)
Eligiendo componente:
void first(Container parent) void next(Container parent) void previous(Container parent) void last(Container parent) void show(Container parent, name)
124
62
GridBagLayout
mantienen igualdad
125
GridBagLayout (II)
El ms flexible (y complejo) de los layout managers. Coloca a las componentes en una grilla de filas y columnas
Ciertos componentes pueden abarcar varias filas o columnas. No todas las filas (columnas) deben que tener el mismo alto (ancho).
Coloca las componentes en celdas y luego utiliza los preferredSize de las componentes para determinar el tamao de las celdas.
POO - EPS - UAM 126
63
GridBagLayout (III)
mantienen igualdad y ocupan todo el ancho
127
GridBagLayout (IV)
Las posiciones y tamaos se especifican mediante restricciones (constraints) para cada componente.
Se crea instancia de GridBagConstraint, Se le da valor a sus variables de instancia, Se asocia la restriccin con el componente
GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); setLayout(gridbag); // Para cada componente a ser agregado: //... Se crea el componente ... //... Se da valor a las variables de c gridbag.setConstraints(theComponent, c); add(theComponent);
POO - EPS - UAM 128
64
Restricciones de GridBagLayout
Se puede usar la misma instancia de GridBagLayout para distintas componentes. gridx, gridy
Especifica la celda que contiene el extremo izquierdo (superior) del componente. La primera celda tiene gridx (gridy) = 0. Usar GridBagConstraints.RELATIVE (el valor por omisin) para especificar que el componente se coloque justo a la derecha (o abajo) del componente anterior.
POO - EPS - UAM 129
Restricciones de GridBagLayout
(II)
gridwidth, gridheight
Especifica el nmero de columnas (filas) que ocupa la componente. No son pixels. El valor default es 1. Usar GridBagConstraints.REMAINDER para especificar que la componente sea la ltima de la fila (columna). Usar GridBagConstraints.RELATIVE para especificar que la componente sea la anteltima en la fila (columna).
130
65
Restricciones de GridBagLayout
(III)
fill
Usado cuando el rea disponible para una componente es mayor que la requerida:
GridBagConstraints.NONE (valor por omisin), GridBagConstraints.HORIZONTAL:lacomponente creceparaocuparhorizontalmentetodaelrea,perono cambiasualto. GridBagConstraints.VERTICAL:lacomponentecrece paraocuparverticalmentetodaelrea,peronocambiasu ancho. GridBagConstraints.BOTH:hacequelacomponente lleneporcompletoelreadisponible.
ipadx, ipady
Especifica el margen interno (por omisin es 0). El ancho (alto) de la componenteEPS - UAM lo menos el ancho (alto)131 POO - es, por mnimo ms ipadx*2 pixels (ipady*2 pixels).
Restricciones de GridBagLayout
(IV)
Insets
Especifica el margen externo de la componente el mnimo espacio entre la componente y los mrgenes del rea disponible. El valor es especificado en un objeto Insets. Por omisin el valor es 0. Usado cuando la componente es menor que el rea disponible, para determinar dnde (dentro del rea) ubicarlo:
Anchor
GridBagConstraints.CENTER (default) GridBagConstraints.NORTH GridBagConstraints.NORTHEAST GridBagConstraints.EAST GridBagConstraints.SOUTHEAST GridBagConstraints.SOUTH GridBagConstraints.SOUTHWEST GridBagConstraints.WEST GridBagConstraints.NORTHWEST
POO - EPS - UAM
132
66
Restricciones de GridBagLayout
(V)
weightx, weighty
Especificar los pesos es un arte que puede tener un impacto significativo en la apariencia final. Son usados para determinar cmo se distribuye el espacio entre las columnas (filas); esto es importante para el comportamiento de redimensionamiento. A menos que se especifique un valor distinto de cero, todas las componentes se agrupan juntas en el centro del contenedor. Esto es porque cuando el peso es 0.0 (default), el GridBagLayout pone cualquier espacio extra en los mrgenes externos del contenedor. (contina)
POO - EPS - UAM 133
Restricciones de GridBagLayout
(VI)
weightx, weighty(cont.)
Generalmente los pesos son especificados con 0.0 y 1.0 como valores extremos, usando nmeros intermedios cuando es necesario. Nmeros mayores indican que la fila (columna) del componente debe tener ms espacio. Para cada columna (fila), el peso es relacionado con el mayor weightx (weighty) especificado para un componente en esa columna (fila).
Para los componentes multicolumnas (multifilas) el peso es dividido de alguna manera entre las columnas (filas) que abarca
67
GridBagLayout: Ejemplo
GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); setLayout(gridbag); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; makebutton("Button1", gridbag, c); makebutton("Button2", gridbag, c); makebutton("Button3", gridbag, c);
POO - EPS - UAM 135
GridBagLayout: Ejemplo
Cada componente tan grande como sea posible
GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); setLayout(gridbag); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; makebutton("Button1", gridbag, c); makebutton("Button2", gridbag, c); makebutton("Button3", gridbag, c);
POO - EPS - UAM 136
68
GridBagLayout: Ejemplo
Si no estuviera
GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); setLayout(gridbag); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; makebutton("Button1", gridbag, c); makebutton("Button2", gridbag, c); makebutton("Button3", gridbag, c);
POO - EPS - UAM 137
GridBagLayout: Ejemplo
Todas las columnas iguales y mayores que 0
GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); setLayout(gridbag); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; makebutton("Button1", gridbag, c); makebutton("Button2", gridbag, c); makebutton("Button3", gridbag, c);
POO - EPS - UAM 138
69
GridBagLayout: Ejemplo
Si no estuviera (es decir, weightx = 0)
GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); setLayout(gridbag); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; makebutton("Button1", gridbag, c); makebutton("Button2", gridbag, c); makebutton("Button3", gridbag, c);
POO - EPS - UAM 139
GridBagLayout: Ejemplo
c.gridwidth = GridBagConstraints.REMAINDER; //end of row makebutton("Button4", gridbag, c); c.weightx = 0.0; //reset to the default makebutton("Button5", gridbag, c); //another row c.gridwidth = GridBagConstraints.RELATIVE; //next to last makebutton("Button6", gridbag, c); c.gridwidth = GridBagConstraints.REMAINDER; //end of row makebutton("Button7", gridbag, c);
POO - EPS - UAM 140
70
GridBagLayout: Ejemplo
c.gridwidth = 1; //reset to the default c.gridheight = 2; c.weighty = 1.0; makebutton("Button8", gridbag, c); c.weighty = 0.0; //reset to the default c.gridwidth = GridBagConstraints.REMAINDER; //end of row c.gridheight = 1; //reset to the default makebutton("Button9", gridbag, c); makebutton("Button10", gridbag, c);
POO - EPS - UAM 141
GridBagLayout: Ejemplo
c.gridwidth = 1; //reset to the default c.gridheight = 2; c.weighty = 1.0; makebutton("Button8", gridbag, c); c.weighty = 0.0; //reset to the default c.gridwidth = GridBagConstraints.REMAINDER; //end of row c.gridheight = 1; //reset to the default makebutton("Button9", gridbag, c); makebutton("Button10", gridbag, c);
POO - EPS - UAM 142
71
GridBagLayout: Ejemplo
makebutton("Button8", gridbag, c); c.weighty = 0.0; //reset to the default c.gridwidth = GridBagConstraints.REMAINDER; //end of row c.gridheight = 1; //reset to the default makebutton("Button9", gridbag, c); makebutton("Button10", gridbag, c);
POO - EPS - UAM 143
GridBagLayout: Ejemplo
protected void makebutton(String name, GridBagLayout gridbag, GridBagConstraints c) { Button button = new Button(name); gridbag.setConstraints(button, c); add(button); }
144
72
73
java.awt.Button
Estado y propiedades
Constructores: Button(), Button(String) Cambiar / acceder a la etiqueta: GetLabel(), SetLabel(String) Botn activo / inactivo: setEnabled(boolean) Emite un ActionEvent al ser pulsado Identificacin para el evento de accin: setActionCommand(String)
Operacin
Asocia un string al botn (por omisin, el mismo que la etiqueta) El string formar parte de la informacin incluida en los ActionEvent's emitidos por el botn (ver getActionCommand() de ActionEvent)
POO - EPS - UAM 148
74
class ButtonDemo extends Frame implements ActionListener { Button b1, b2, b3; ButtonDemo () { setLayout (new FlowLayout ()); b1 = new Button (); b1.setLabel ("Disable middle button"); b1.setActionCommand ("Disable"); b2 = new Button ("Middle button"); b3 = new Button ("Enable middle button"); b3.setEnabled (false); b3.setActionCommand ("Enable"); add (b1); add (b2); add (b3); b1.addActionListener (this); b3.addActionListener (this); } ...
POO - EPS - UAM 149
... public void actionPerformed (ActionEvent e) { String command = e.getActionCommand(); if (command.equals ("Disable")) { b1.setEnabled (false); b2.setEnabled (false); b3.setEnabled (true); } else { b1.setEnabled (true); b2.setEnabled (true); b3.setEnabled (false); } }
150
75
Widgets de seleccin
Checkbox List Choice Menu
Emiten ActionEvents
Ahorro de espacio
Emiten ItemEvents
POO - EPS - UAM 151
java.awt.Checkbox
Descripcin
Botn seleccionable con dos estados: seleccionado / deseleccionado Agrupable en grupos de botones de seleccin excluyente (radio buttons) Checkbox(), Checkbox(String), Checkbox(String,boolean) getLabel(), setLabel(String) getState(), setState(boolean)
POO - EPS - UAM 152
Estado y propiedades
76
java.awt.Checkbox (cont.)
Operacin
Emite un ItemEvent al cambiar de estado El item asociado el evento es el label del checkbox Identificacin del item desde el evento:
getItem()String (label del checkbox) getItemSelectable()Object (la componente checkbox) Crear objeto de la clase CheckboxGroup Utilizar el constructor Checkbox(String,boolean,CheckboxGroup) Los checkbox creados con el mismo grupo como argumento forman un grupo Slo un checkbox de un grupo puede estar seleccionado
POO - EPS - UAM 153
class CheckboxDemo extends Frame { CheckboxDemo () { setLayout (new GridLayout (1, 2)); Panel p1 = new Panel (); Checkbox cb = new Checkbox (); cb.setLabel ("Checkbox 1"); cb.setState (true); p1.add (cb); p1.add (new Checkbox ("Checkbox 2")); p1.add (new Checkbox ("Checkbox 3")); add (p1); Panel p2 = new Panel (); CheckboxGroup group = new CheckboxGroup (); p2.add (new Checkbox ("Checkbox 4", group, false)); p2.add (new Checkbox ("Checkbox 5", group, false)); p2.add (new Checkbox ("Checkbox 6", group, false)); add (p2);
POO - EPS - UAM 154
77
155
java.awt.Choice
Descripcin
Estado y propiedades
Operacin
78
java.awt.List
Descripcin
Lista de seleccin con barras de scroll El modo de seleccin puede ser simple o mltiple
List(), List(int), List(int,boolean) add(String), add(String,int), remove(String), remove(int), getItem(int), getItems(), getItemCount(), getRows() select(int), select(String), isIndexSelected(int), getSelectedItem() String, getSelectedIndex() int, getSelectedObjects() Object[] isMultipleMode(), setMultipleMode(boolean)
POO - EPS - UAM 157
Estado y propiedades
java.awt.List (cont.)
Operacin
El item asociado al evento es el nmero de posicin del item seleccionado Doble click: emite ActionEvent con el texto del item seleccionado como action command string
158
79
class ListDemo extends Frame implements ActionListener, ItemListener { TextArea output; List spanish, italian; ListDemo () { setLayout (new FlowLayout ()); spanish = new List (3, true); spanish.add ("uno"); spanish.add ("dos"); spanish.add ("tres"); spanish.add ("cuatro"); spanish.addActionListener (this); spanish.addItemListener (this); italian = new List (); italian.add ("uno"); italian.add ("due"); italian.add ("tre"); italian.add ("quattro"); italian.addActionListener (this); italian.addItemListener (this); ... POO - EPS - UAM
159
... Panel p = new Panel (); p.setLayout (new GridLayout (2, 1, 10, 10)); p.add (spanish); p.add (italian); output = new TextArea (10, 40); output.setEditable (false); add (output); add (p); } // Fin del constructor ...
160
80
... public void actionPerformed (ActionEvent e) { List list = (List) (e.getSource ()); String language = (list == spanish)? "Spanish" : "Italian"; output.append ("Action event on " + list.getSelectedItem () + " in " + language + ".\n"); } public void itemStateChanged (ItemEvent e) { List list = (List) (e.getItemSelectable ()); String language = (list == spanish)? "Spanish" : "Italian"; int index = ((Integer) (e.getItem ())) .intValue (); if (e.getStateChange () == ItemEvent.SELECTED) { output.append ("Select event on item " + index + " (" + list.getItem (index) + ")" + " in " + language + ".\n"); } else output.append ("Deselect event on item " + index + " (" + list.getItem (index) + ")" + " in " + language + ".\n"); } }
POO - EPS - UAM 161
162
81
java.awt.Menu
Descripcin
Conjunto de items de distintas modalidades:
Menu
POO - EPS - UAM
CheckBoxMenuItem
163
java.awt.Menu
Construccin
Menu(), Menu(String), MenuItem(), MenuItem(String), CheckboxMenuItem(), CheckboxMenuItem(String) Aadir items: add(String|MenuItem|CheckboxMenuItem| Menu), insert(String|MenuItem|...,int), getItem(int), addSeparator() Se requiere una barra de mens para aadir mens a una ventana:
164
82
java.awt.Menu (cont.)
Estado y propiedades
getLabel(), setLabel(String)de Menu / MenuItem Activar / desactivar item: isEnabled(), setEnabled(boolean)de Menu / MenuItem Seleccin de CheckboxMenuItem: getState(), setState(boolean)
POO - EPS - UAM 165
java.awt.Menu (cont.)
Operacin
MenuItem emite slo ActionEvent como un botn, con el label del item pulsado como action command string Source del evento: el item o el Menu contenedor del item CheckboxMenuItem emite slo ItemEvent como un checkbox, con el label del item seleccionado / deseleccionado como label del evento Source del evento: el propio CheckboxMenuItem
166
83
Widgets de texto
TextComponent Label TextField TextArea
167
java.awt.Label
Descripcin
Texto esttico
Estado y propiedades
Label(), Label(String), Label(String,LEFT|RIGHT| CENTER) getText(), setText(String) getAlignment(), setAlignment(LEFT|RIGHT|CENTER)
Operacin
No tiene
POO - EPS - UAM 168
84
java.awt.TextComponent
Descripcin
Estado y propiedades
169
java.awt.TextField
Descripcin
Operacin
Cuando se pulsa 'Enter' emite un ActionEvent con el texto del widget como action command string
POO - EPS - UAM 170
85
java.awt.TextArea
Descripcin
Scrollbars: TextArea(String,int,int,int),
TextArea.SCROLLBARS_NONE, SCROLLBARS_VERTICAL_ONLY... getColumns(), setColumns(int), getRows(), setRows(int) append(String), insert(String,int), replaceRange(String,int,int)
Operacin
class TextDemo extends Frame implements ActionListener { TextField textField; TextArea textArea; TextDemo () { setLayout (new FlowLayout ()); textField = new TextField (20); textArea = new TextArea (5, 20); textArea.setEditable (false); add (textField); add (textArea); textField.addActionListener (this); } public void actionPerformed (ActionEvent evt) { String text = textField.getText (); textArea.append (text + "\n"); textField.selectAll (); }
POO - EPS - UAM 172
86
173
java.awt.Dialog
Descripcin
Estado y propiedades
Dialog (Frame [,String] [,boolean]) Modal / no modal: isModal(), setModal(boolean) isResizeable(), setResizeable(boolean) de Window FileDialog extends Dialog
87
class DialogWindow extends Frame implements ActionListener { private SimpleDialog dialog; private TextArea textArea; public DialogWindow () { textArea = new TextArea (5, 40); textArea.setEditable (false); add ("Center", textArea); Button button = new Button ("Click to bring up dialog"); button.addActionListener (this); Panel panel = new Panel (); panel.add (button); add ("South", panel);
} public void actionPerformed (ActionEvent event) { if (dialog == null) dialog = new SimpleDialog (this, "A Simple Dialog"); dialog.setVisible (true); } public void addLine (String text) { textArea.append(text + "\n"); }
POO - EPS - UAM 175
class SimpleDialog extends Dialog implements ActionListener { TextField field; DialogWindow parent; Button setButton; SimpleDialog (Frame w, String title) { super (w, title, false); parent = (DialogWindow) w; Panel p1 = new Panel (); p1.setLayout (new GridLayout (2, 1)); Label label = new Label ("Enter text here:"); p1.add (label); field = new TextField (40); field.addActionListener (this); p1.add (field); add ("Center", p1); ...
176
88
... Panel p2 = new Panel(); p2.setLayout (new FlowLayout (FlowLayout.RIGHT)); Button b = new Button ("Cancel"); b.addActionListener (this); setButton = new Button ("Set"); setButton.addActionListener (this); p2.add (b); p2.add (setButton); add ("South", p2); pack (); } public void actionPerformed (ActionEvent event) { Object source = event.getSource(); if ((source == setButton) || (source == field)) parent.addLine (field.getText()); field.selectAll (); setVisible (false); } }
POO - EPS - UAM 177
java.awt.Dialog
178
89
Widgets personalizados
class Boton extends Canvas implements MouseListener { private boolean selected = false; protected String label; public Boton (String str) { label = str; addMouseListener (this); new Mover (this); } public void paint (Graphics g) { Dimension dim = getSize (); FontMetrics metrics = g.getFontMetrics (); g.drawRect (0, 0, dim.width-1, dim.height-1); g.drawString (label, (dim.width - metrics.stringWidth (label)) / 2, (dim.height - metrics.getHeight ()) / 2 + metrics.getMaxAscent ()); } ... POO - EPS - UAM 179
90
... public void mouseClicked (MouseEvent e) { selected = !selected; if (selected) { setBackground (Color.black); setForeground (Color.white); } else { setBackground (Color.white); setForeground (Color.black); } } public public public public ... void void void void mousePressed (MouseEvent e) {} mouseReleased (MouseEvent e) {} mouseEntered (MouseEvent e) {} mouseExited (MouseEvent e) {}
181
... public String getLabel () { return label; } public void setLabel (String str) { label = str; repaint (); } public boolean getState () { return selected; } public void setState (boolean state) { selected = state; if (selected) { setBackground (Color.black); setForeground (Color.white); } else { setBackground (Color.white); setForeground (Color.black); } } // public void mouseClicked (MouseEvent e) { // setState (!selected); // }
POO - EPS - UAM 182
91
class Boton2 extends Boton { boolean pointedAt = false; public Boton2 (String str) { super (str); } public void paint (Graphics g) { super.paint (g); Dimension dim = getSize (); if (pointedAt) g.drawRect (4, 4, dim.width-9, dim.height-9); }
public void mouseEntered (MouseEvent e) { pointedAt = true; repaint (); } public void mouseExited (MouseEvent e) { pointedAt = false; repaint (); }
}
POO - EPS - UAM 183
1. Inicio
4. Exit
2. Enter
5. Enter
3. Click
6. Drag
184
92
class BotonAccion extends Boton { private ActionListener multicaster = null; public BotonAccion (String str) { super (str); } public void mouseClicked (MouseEvent e) { super.mouseClicked (e); Generacin de eventos en processEvent ( respuesta a la interaccin new ActionEvent ( this, ActionEvent.ACTION_PERFORMED, label)); } public void addActionListener (ActionListener listener) { multicaster = AWTEventMulticaster.add (multicaster, listener); } public void processEvent (AWTEvent e) { if (e.getID () == ActionEvent.ACTION_PERFORMED && multicaster != null) multicaster.actionPerformed ((ActionEvent) e); super.processEvent (e); }
POO - EPS - UAM 185
93