Professional Documents
Culture Documents
Juan Pavn Mestras Dep. Ingeniera del Software e Inteligencia Artificial Universidad Complutense Madrid
Basado en el curso Objects First with Java - A Practical Introduction using BlueJ, David J. Barnes, Michael Klling
Conceptos
Componentes de las interfaces Disposicin (layout) de los elementos de la interfaz grfica Gestin de eventos Clases anidadas annimas
Clases anidadas
Aplicaciones
Applets
Disposicin (layout): cmo se colocan los componentes para lograr un GUI cmodo de utilizar
Funcionalidad independiente de la plataforma Bsico y experimental Estndar hasta la versin JDK 1.1.5
Look & Feel y funcionalidad independiente de la plataforma Desarrollado 100% en Java Portable: si se elige un look&feel soportado por Swing (o se programa uno) puede asegurarse que la GUI se ver igual en cualquier plataforma Mucho ms completo que AWT
Programacin Orientada a Objetos
Swing utiliza el modelo de eventos basado en delegacin de AWT (definido a partir de Java 1.1)
Contenedores
Superficie simple de dibujo botones, listas, mens, casillas de verificacin, campos de texto, etc. ventanas, marcos, barras de mens, cuadros de dilogo
Graphics
Component
Button Canvas
TextComponent
Container
TextField
Window
Dialog
java.applet.
List Scrollbar
Applet FileDialog
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08 Programacin Orientada a Objetos
Contenedores
Panel
Sirve para colocar botones, etiquetas, etc. No existe sin una ventana que lo albergue Un applet es un panel Sirve para crear nuevas ventanas independientes Ventanas gestionadas por el administrador de ventanas de la plataforma (Windows, Motif, Mac, etc.) Normalmente se usan dos tipos de ventanas:
Frame: ventana donde se pueden colocar mens Dialog: ventana para comunicarse con el usuario
Se usan para colocar botones, etiquetas, etc. Cumple la misma funcin que un panel, pero en una ventana independiente
Window
10
Barra de men
Ttulo
Controles de la ventana
Panel de contenidos
11
La clase javax.swing.JFrame
Toda aplicacin Swing tiene, al menos, un contenedor raz (una ventana) La clase JFrame proporciona ventanas al uso (aunque puede haber otro tipo de ventanas) A su vez, JFrame incluye una serie de elementos:
Los contenidos se aaden en el panel de contenidos (content pane) accesible a travs del mtodo getContentPane (por defecto, un objeto de tipo Jpane, aunque puede cambiarse con setContentPane). La barra de men puede fijarse con setJMenuBar
12
13
Botn de interaccin que puede tener una etiqueta Muestra una cadena de slo lectura
Normalmente para asociar el texto con otro componente
Campo de una lnea que permite introducir y editar texto Campo de texto de varias lneas Mayor funcionalidad
Aadir, reemplazar e insertar texto Barras de desplazamiento
Para definir una barra de mens, cada men y los elementos de cada men
Programacin Orientada a Objetos
14
Uso de componentes
1) Crear el componente
2) Aadirlo al contenedor
usando add: contentPane.add(b); // aadir en el contenedor contentPane // crear y aadir el componente en una sla operacin: contentPane.add(new Label(Etiqueta 1)); contentPane.add(new Label(Etiqueta 2)); Si luego se quiere quitar, usar remove(componente)
15
16
Tratamiento de eventos
Los eventos se corresponden a las interacciones del usuario con los componentes Los componentes estn asociados a distintos tipos de eventos
Las ventanas (p.ej. JFrame) estn asociadas con WindowEvent Los mens estn asociados con ActionEvent
Estos objetos sern notificados de la ocurrencia de un evento Por eso se llaman listeners Tienen definidos mtodos que se llaman cuando ocurre el evento asociado
17
Tratamiento de eventos
ActionEvent
18
Tratamiento de eventos
El objeto listener debe ser de una clase que herede la interfaz correspondiente al tipo de evento que va a tratar
class ImageViewer implements ActionListener { public void actionPerformed(ActionEvent e) { } }
19
Los componentes tienen mtodos para poder aadir o quitar objetos oyentes
addActionListener(ActionListener l) removeActionListener(ActionListener l)
20
21
El ejemplo muestra un tratamiento centralizado de los eventos en la propia clase principal Aunque funciona Es mejor definir clases especficas por cada evento
22
Clases anidadas
23
Clases anidadas
Las instancias de las clases internas estarn dentro de la clase contenedora Las instancias de la clase interna tienen acceso a la parte privada de la clase contenedora
Esto es prctico porque el tratamiento de un evento requiere normalmente acceso al estado de la aplicacin
24
Obedecen las reglas de las clases internas Se usan para crear objetos especficos en un momento, para los que no es necesario dar un nombre de clase Tienen una sintaxis especial La instancia es siempre referenciada por su supertipo, ya que no tiene nombre el subtipo
25
ActionListener annimo
JMenuItem openItem = new JMenuItem("Open"); Anonymous object creation openItem.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { openFile(); } } ); Class definition Actual parameter
26
WindowAdapter es una implementacin de la interfaz WindowListener donde todas las operaciones estn declaradas como vacas
27
El proyecto ImageViewer
28
Procesamiento de imgenes
29
ImageViewer
Se encarga de la estructura de la GUI Mtodos estticos para cargar y salvar las imgenes en ficheros Visualiza la imagen dentro de la GUI Modela una imagen en 2D
ImageFileManager
ImagePanel
OFImage
30
La clase OFImage
Subclase de java.awt.image.BufferedImage
Representa una imagen con un buffer para acceder a los datos de la imagen
31
32
33
Cmo se colocan los componentes (usando el mtodo add) depende del gestor de disposicin del contenedor (layout manager) Tipos de disposiciones:
FlowLayout
Los componentes se ponen de izquierda a derecha hasta llenar la lnea, y se pasa a la siguiente. Cada lnea se centra
Por defecto, en paneles y applets
BorderLayout
Se ponen los componentes en un lateral o en el centro se indica con una direccin:East, West, North, South, Center
Por defecto, en ventanas JFrame
GridLayout
Se colocan los componentes en una rejilla rectangular (filas x cols) Se aaden en orden izquierda-derecha y arriba-abajo
Para poner una disposicin se utiliza el mtodo setLayout(): GridLayout nuevolayout = new GridLayout(3,2); setLayout(nuevolayout);
34
FlowLayout
componente6
contenedor
componente1 componente3 componente5
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08
GridLayout(3,2)
35
Contenedores anidados
Se puede utilizar JPanel como contenedor bsico Cada contenedor tendr su layout manager especfico
contenedor
componente1 componente2
contenedor
componente3 componente4 componente5
36
GridBagLayout
Similar al GridLayout pero mas verstil Presenta los componentes en una rejilla, pero:
Un componente puede ocupar ms de una fila y ms de una columna Las filas y las columnas pueden tener tamaos diferentes No se tiene que rellenar en un orden predeterminado
Utiliza GridBagConstraints para especificar cmo deben colocarse, distribuirse, alinearse, etc., los componentes
37
Administradores de diseo
38
FlowLayout
39
BorderLayout
40
GridLayout
41
BoxLayout
42
Botones
Los botones, junto con los mens, son los controles ms tpicos en una GUI Existen diferentes tipos (especializaciones de AbstractButton)
JButton: Botn aislado. Puede pulsarse, pero su estado no cambia JToggleButton : Botn seleccionable. Cuando se pulsa el botn, su estado pasa a seleccionado, hasta que se pulsa de nuevo (entonces se deselecciona)
isSelected() permite chequear su estado
JCheckBox : Especializacin de JToggleButton que implementa una casilla de verificacin. Botn con estado interno, que cambia de apariencia de forma adecuada segn si est o no est seleccionado JRadioButton: Especializacin de JToggleButton que tiene sentido dentro de un mismo grupo de botones (ButtonGroup) que controla que slamente uno de ellos est seleccionado
Nota: ButtonGroup es nicamente un controlador, no un componente)
Botones
Box caja = Box.createHorizontalBox(); caja.add(new JButton("Un botn normal")); caja.add(new JToggleButton("Un botn seleccionable")); caja.add(new JToggleButton("Otro botn seleccionable",true)); caja.add(new JCheckBox("Cine")); caja.add(new JCheckBox("Teatro")); caja.add(new JCheckBox("Msica")); ButtonGroup grupo = new ButtonGroup(); JRadioButton r1 = new JRadioButton("Hombre"); JRadioButton r2 = new JRadioButton("Mujer"); JRadioButton r3 = new JRadioButton("Asexuado"); grupo.add(r1); grupo.add(r2); grupo.add(r3); caja.add(r1); caja.add(r2); caja.add(r3);
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08 Programacin Orientada a Objetos
44
Mens
45
Mens
La creacin de una barra de mens bsica supone:
Crear un objeto de tipo JMenuBar. Para cada entrada, crear un objeto de tipo JMenu. Incluir objetos de tipo JMenuItem en el men. Esto puede incluir mens anidados. Asociar a los items acciones apropiadas (notifican eventos semnticos de tipo ActionEvent, ya que, en realidad, especializan a AbstractButton).
Con setJMenuBar es posible aadir una barra de mens a una ventana (JFrame). Importante: En una GUI, muchas veces existen controles ligados a la misma accin (eg. un botn que hace lo mismo que un item de un men). En este caso ambos controles pueden compartir el mismo oyente (y es aconsejable hacerlo as). Ms importante an: El diseo de una barra de mens debe ser consistente (poner opciones semnticamente relacionadas juntas).
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08 Programacin Orientada a Objetos
46
Mens
public class PruebaMenu extends JFrame { public void ejecuta() { JMenuBar barra = new JMenuBar(); JMenu menu1 = new JMenu("Men 1"); menu1.add(new JMenuItem("Una opcin de texto")); menu1.add(new JSeparator()); ButtonGroup grupo = new ButtonGroup(); JRadioButtonMenuItem r1 = new JRadioButtonMenuItem("Opcin 1"); JRadioButtonMenuItem r2 = new JRadioButtonMenuItem("Opcin 2"); grupo.add(r1); grupo.add(r2); menu1.add(r1); menu1.add(r2); menu1.add(new JSeparator()); menu1.add(new JCheckBoxMenuItem("Seleccin 1",true)); menu1.add(new JCheckBoxMenuItem("Seleccin 2")); JMenu menu11 = new JMenu("Submen"); menu11.add(new JMenuItem("Opcin 1")); menu11.add(new JMenuItem("Opcin 2")); menu1.add(menu11); barra.add(menu1); barra.add(new JMenu("Men 2")); setJMenuBar(barra); pack(); setVisible(true); } public static void main(String[] args) { new PruebaMenu().ejecuta(); }}
Programacin Orientada a Objetos
47
Interaccin modal
Muchas veces surge la necesidad de lanzar, espordicamente, ventanas secundarias para indicar algn hecho, o pedir algn dato al usuario: cuadros de dilogo La mayor parte de estas interacciones suelen ser modales (es decir, la ejecucin del programa se interrumpe hasta que el usuario cierra el cuadro de dilogo) Swing ofrece la posibilidad de crear dilogos a medida pero (afortunadamente), tambin ofrece la posibilidad de crear/configurar dilogos prefabricados que son tiles en muchas situaciones Cmo funciona la interaccin modal?: Swing lanza un hilo adicional para manejar dichas interacciones (y el resto de los eventos rutinarios). El hilo de tratamiento de eventos se sincroniza (espera) la finalizacin de dicho hilo de interaccin modal Importante: Un abuso de la interaccin modal conduce a interfaces poco usables (en el lmite, a interacciones tipo consola)
Programacin Orientada a Objetos
48
Interaccin modal
La clase JOptionPane ofrece un conjunto de mtodos estticos que lanzan diferentes tipos de dilogos (estos mtodos estn sobrecargados para poder crear dilogos con diferentes grados de fineza):
showMessageDialog : Muestra un dilogo de mensaje showConfirmDialog : Muestra un dilogo de confirmacin. Permite determinar la opcin elegida por el usuario de forma modal (yes, no, cancel) showInputDialog: Muestra un dilogo en el que se solicita, de forma modal, una entrada al usuario. Dependiendo de la versin de mtodo utilizada, el usuario puede teclear la entrada, o bien seleccionarla de una lista de entradas disponibles showOptionDialog: Muestra un dilogo que puede personalizarse con botones (en general, con componentes) a medida
Programacin Orientada a Objetos
49
Interaccin modal
JOptionPane.showMessageDialog(this, // // La La ventana ventana padre. padre. JOptionPane.showMessageDialog(this, "Error deconocido!: Lo llevas muy mal!", //El mensaje. "Error deconocido!: Lo llevas muy mal!", //El mensaje. "Error", // // El El ttulo ttulo de de la la ventana ventana de de dilogo. dilogo. "Error", JOptionPane.ERROR_MESSAGE // El tipo de mensaje JOptionPane.ERROR_MESSAGE // El tipo de mensaje ); );
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this, "Te informo informo de de que que lo lo llevas llevas fatal", fatal", "Info", "Info", "Te JOptionPane.INFORMATION_MESSAGE ); JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this, "Te aviso aviso de de que que lo lo llevas llevas fatal", fatal", "Aviso", "Aviso", "Te JOptionPane.WARNING_MESSAGE); JOptionPane.WARNING_MESSAGE); JOptionPane.showMessageDialog(this, JOptionPane.showMessageDialog(this, Este mensaje mensaje es es para para t, t, majete!", majete!", "Mensaje", "Mensaje", Este JOptionPane.PLAIN_MESSAGE); JOptionPane.PLAIN_MESSAGE);
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08
50
Interaccin modal
int seleccionada seleccionada == int JOptionPane.showConfirmDialog(this, JOptionPane.showConfirmDialog(this, "Lo aceptas?", aceptas?", "Aviso", "Aviso", "Lo JOptionPane.YES_NO_OPTION, // Configuracin Configuracin del del mensaje mensaje JOptionPane.YES_NO_OPTION, // JOptionPane.INFORMATION_MESSAGE); JOptionPane.INFORMATION_MESSAGE); switch(seleccionada) {{ switch(seleccionada) case JOptionPane.YES_OPTION: JOptionPane.YES_OPTION: ... ... // // tratar tratar SI SI case case JOptionPane.NO_OPTION: .. // tratar NO case JOptionPane.NO_OPTION: .. // tratar NO case JOptionPane.CLOSED_OPTION: JOptionPane.CLOSED_OPTION: .. .. // // tratar tratar ventana ventana cerrada cerrada case default: ... // esta opcin nunca debera alcanzarse default: ... // esta opcin nunca debera alcanzarse }} int seleccionada seleccionada == int JOptionPane.showConfirmDialog(this, JOptionPane.showConfirmDialog(this, "Lo aceptas?","Aviso", aceptas?","Aviso", "Lo JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); JOptionPane.WARNING_MESSAGE); ... // los posibles posibles valores valores devueltos devueltos son son los los anteriores anteriores yy ... // los ... // JOptionPane.CANCEL_OPTION ... // JOptionPane.CANCEL_OPTION
51
Interaccin modal
String nombre nombre == JOptionPane.showInputDialog(this, JOptionPane.showInputDialog(this, String "Cmo te llamas, majete?", "Cmo te llamas, majete?", "Peticin", JOptionPane.QUESTION_MESSAGE "Peticin", JOptionPane.QUESTION_MESSAGE ); ); // ... ... procesar procesar entrada entrada //
String[] colores colores == {"rojo","negro","amarillo", {"rojo","negro","amarillo", String[] "azul","majenta"}; "azul","majenta"}; Object opcion = Object opcion = JOptionPane.showInputDialog(this, JOptionPane.showInputDialog(this, "Selecciona un un color, color, resalao!", resalao!", "Peticin", "Peticin", "Selecciona JOptionPane.QUESTION_MESSAGE, JOptionPane.QUESTION_MESSAGE, null, //icono. //icono. no no hay. hay. null, colores, // opciones. Se le le podra podra pasar pasar un un array array de de colores, // opciones. Se // objetos arbitrarios // objetos arbitrarios colores[0] //opcin //opcin inicial inicial colores[0] ); ); // ...procesar ...procesar opcin... opcin... //
52
Interaccin modal
String[] sexo sexo == {"hetero","homo","bi","auto"}; {"hetero","homo","bi","auto"}; String[] int opcion = int opcion = JOptionPane.showOptionDialog(this, JOptionPane.showOptionDialog(this, "Y t t qu qu eres?", eres?", "Peticin", "Peticin", "Y -1, // opciones->quedan fijadas por por el el array array de de opciones opciones -1, // opciones->quedan fijadas JOptionPane.QUESTION_MESSAGE, JOptionPane.QUESTION_MESSAGE, null,//icono. no no hay. hay. null,//icono. sexo, // array de opciones sexo, // array de opciones sexo[0] // // opcion opcion inicial inicial sexo[0] ); ); ... // // procesamiento procesamiento de de la la opcion opcion ... ... ...
53
Los dilogos de tipo JFileChooser facilitan esta tarea La forma habitual de trabajar con JFileChooser es:
Crear una instancia de JFileChooser. Configurar dicha instancia de forma adecuada. Dicha configuracin, normalmente, se limita a poner filtros sobre lo que puede seleccionarse con el selector de ficheros, as como a fijar la carpeta actual (con setCurrentDirectory):
Con setFileSelectionMode. Con setFileFilter : Aqu debe aadirse una instancia de una subclase adecuada de FileFilter.
La interaccin es modal: los mtodos show devuelven el estado de la operacin. Si todo ha ido bien, el mtodo getSelectedFile devuelve un objeto de tipo File, que debe ser tratado de forma adecuada
Programacin Orientada a Objetos
54
Un filtro de ficheros
class FiltroTexto extends FileFilter { public boolean accept(File f) { String nombre = f.getName(); return nombre.substring(Math.max(nombre.length()-4,0)).equals(".txt"); } public String getDescription() { return "Ficheros de tipo texto"; } }
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08 Programacin Orientada a Objetos
55
selector.showOpenDialog(this)
selector.showSaveDialog(this)
56
Interaccin modal: seleccin de archivos Uso habitual de un dilogo creado a travs de un FileChooser
if ( selector.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ) { File f = selector.getSelectedFile(); // Hacer lo que sea pertinente con el fichero ... }
57
Se utiliza para poner otros componentes FlowLayout por defecto (los componentes se colocan uno detrs de otro)
JScrollPane. Un panel con barras de scroll JTabbedPane. Un panel con diferentes vistas
Puede cambiarse de situacin por los bordes de su contenedor e incluso llevarse fuera Las herramientas suelen ser (aunque no obligatoriamente) botones Juan Pavn Mestras
Facultad de Informtica UCM, 2007-08 Programacin Orientada a Objetos
58
JLabel. Etiquetas JTextField. Entrada de una lnea de texto JTextArea. Entradas de varias lneas de texto JSlider. Una barra de seleccin en una escala JList. Una lista de elementos seleccionables JComboBox. Una lista de elementos desplegable JPopupMenu. Un men desplegable
59
La clase Graphics
Clase abstracta que es la base para los contextos grficos que permiten a una aplicacin dibujar los componentes independientemente del dispositivo de salida Un contexto grfico es un objeto que funciona junto con las ventanas para mostrar los objetos grficos Habitualmente no hay que crear ningn contexto grfico ya que esto es parte del framework de AWT
Se obtiene mediante el mtodo getGraphics()
Mediante el mtodo paint(Graphics contexto) se determina que es lo que se debe mostrar en dicho contexto
60
La clase Graphics
Proporciona mtodos para dibujar, rellenar, pintar imgenes, copiar reas y pegar grficos en pantalla
drawLine drawRect y fillRect drawPolygon drawPolyline drawOval y fillOval drawArc y fillArc drawString setFont
(0,0)
x (100,0)
y (0,100)
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08 Programacin Orientada a Objetos
(width-1,height-1)
61
public void paint(Graphics g) { // obtener el color original Color colorOriginal = g.getColor(); // escribir texto grafico en la ventana y recuadrarlo g.drawString(cad, 40, 20); g.drawRect(35, 8, (cad.length()*7), 14); // dibujo de algunas lineas for (int i=20; i< 50; i= i+3) { if ((i % 2) == 0) g.setColor(Color.blue); else g.setColor(Color.red); g.drawLine(40, (90-i), 120, 25+i); } // dibujo y relleno de un valo g.drawOval(40, 95, 120, 20); g.fillOval(40, 95, 120, 20); g.setColor(colorOriginal); } }
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08 Programacin Orientada a Objetos
62
63
int height = getHeight(); int width = getWidth(); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { Color pixel = getPixel(x, y); alter the pixel's color value; setPixel(x, y, pixel); } }
64
65
Ms filtros
Define una superclase (abstract) Filter Crear subclases para funciones especficas Crear una coleccin de instancias de subclases en ImageViewer. Definir un mtodo genrico applyFilter Ver imageviewer2-0
66
imageviewer2-0
67
68
Borders
69
Adding spacing
JPanel contentPane = (JPanel)frame.getContentPane(); contentPane.setBorder(new EmptyBorder(6, 6, 6, 6)); // Specify the layout manager with nice spacing contentPane.setLayout(new BorderLayout(6, 6)); imagePanel = new ImagePanel(); imagePanel.setBorder(new EtchedBorder()); contentPane.add(imagePanel, BorderLayout.CENTER);
70
Resumen
71
Resumen
La aplicacin avanza guiada por los eventos del usuario Cuando, desde el cdigo de la aplicacin, se realizan cambios sobre la interfaz (p.ej. cambiar el texto de una etiqueta, dibujar algo, limpiar un cuadro de texto, etc.) tales cambios no son inmediatos, sino que se encolan (en estructuras internas del framework AWT/Swing) para ser procesados por el hilo de tratamiento de eventos una vez que termine la ejecucin del cdigo del oyente que ha provocado los cambios
La ejecucin de mtodos que cambian la presentacin de componentes no debe interpretarse como ejecuciones, sino como promesas de ejecuciones (que se realizarn cuando sea posible)
72