Upload
nguyenhanh
View
217
Download
0
Embed Size (px)
Citation preview
0
Desarrollo de Aplicaciones en Java
INF 473
Prof. José Miguel [email protected]@inf.ucv.cl
PUCVMarzo 2008
Desarrollo de Interfaces GráficasComponentes Swing III
2
Menús (II)� Menús normales y desplegables:
» JMenuBar (menú normal)– Constructor:
� public JMenuBar()
– Métodos: � public JMenu add(JMenu c)
– Asignación de menús (en objetos de tipo JFrame, JDialog y JApplet); no se hace en el “contentPane”:
� public void setJMenuBar(JMenuBarmenubar)
» JPopupMenu (menú desplegable)– Constructor:
� public JPopupMenu(String label)
– Métodos: � public JMenuItem add (JMenuItem
menuItem)� public void addSeparator()
– Mostrar el menú: � public void show(Component invoker, int x,
int y)
3
Menús (III)
� JMenu» Constructor:
– public JMenu(String s)
» Métodos:– public JMenuItem add(JMenuItem
menuItem)– public void addSeparator()
� JMenuItem» Constructor:
� public JMenuItem(String text)
» Eventos: ActionEvent
� JCheckBoxMenuItem» Constructor:
� public JCheckBoxMenuItem(String text, boolean selected)
» Eventos: ActionEvent, ItemEvent
4
Menús (IV)
� JRadioButtonMenuItem» No permite selección múltiple
» Constructor: � public JRadioButtonMenuItem(String text,
boolean selected)
» Eventos: ActionEvent, ItemEvent» Para permitir uno solo activable, se
crea un grupo: – ButtonGroup:
� public void add(AbstractButton b)
6
Operación de pintar
� ¿Cómo se pinta?» Clase java.awt.Graphics
– Contexto gráfico o pincel virtual– Métodos:
� public abstract void drawString(String str, intx, int y)
� public abstract void fillOval(int x, int y, intwidth, int height)
� public void drawRect(int x, int y, int width, intheight)
� public abstract void setFont(Font font)� public abstract void setColor(Color c)
» Una vez creada una componente, se puede acceder a su contexto gráfico:
– Clase JComponent� public Graphics getGraphics()
7
Eventos de pintar (I)� ¿Cuándo se pinta?
– Una vez creada una componente, haciendo:
� Graphics g = <componente>.getGraphics();� g.<método-de-pintar>Inconveniente: habría que ejecutarlo en
muchas ocasiones
– En respuesta a la generación de un evento de “pintar” que llega a la cola de eventos.
� Respuesta al evento de “pintar”:» Se ejecuta el método “paint” de la
componente» JComponent
� public void paint (Graphics g)» Es público» Llama a “paintComponent”, a
“paintBorder” y a “paintChildren”� protected void paintComponent(Graphics g)
» Pinta el background
8
Eventos de pintar (II)
� Modos de generación de un evento de “pintar”» Automático:
– Mostrar la ventana por primera vez; desiconizar una ventana; activar la ventana que se encontraba total o parcialmente oculta, etc.
» Llamada al método (java.awt.Component):
– public void repaint()
� Componentes no predefinidas: » Subclase de JPanel, redefiniendo
“paintComponent”� Llamando primero a “super.paintComponent”
� Ejemplo:» “Pintar-Imagen-Animación“
9
Imágenes y animaciones
� Creación de imágenes:» Clase Graphics
� public abstract boolean drawImage(Imageimg, int x, int y, int width, int height, ImageObserver observer)
» JComponent desciende de ImageObserver (interface)
» Clase java.awt.Toolkit� public static Toolkit getDefaultToolkit()� public abstract Image getImage(String
filename)� public abstract Image getImage(URL url)
� Animaciones: » Creación de un thread que duerme y
repinta– Uso de “timers” (threads predefinidos),
mediante la clase Timer� Ejemplo
» “Animación-Timers”
11
Movimientos de ratón (I)
� Clase java.awt.event.MouseEvent» Constructor
� public MouseEvent(Component source, intid, long when, int modifiers, int x, int y, intclickCount, boolean popupTrigger, int button)
» Métodos: � public int getButton() (botón del ratón)� public int getClickCount()� public int getX()� public int getY()� public Object getSource()
� Movimientos de ratón: – java.awt.event.MouseMotion Listener
� public void mouseDragged(MouseEvent e)� public void mouseMoved(MouseEvent e)
12
Movimientos de ratón (II)
� Dos tipos de interacciones: » 1) Mover ratón sin tocar sus botones
» 2) Arrastrar ratón
� 1) Mover ratón sin tocar sus botones» Eventos generados:
– Un MouseEvent por cada “desplazamiento infinitesimal”
� El “getSource”, “getX” y “getY” son relativos a la componente bajo el ratón
� Recogido por un MouseMotionListener y procesado por “mouseMoved”
13
Movimientos de ratón (III)
� 2) Arrastrar ratón» Eventos generados:
– Un MouseEvent inicial � Recogido por un MouseListener y procesado
por “mousePressed”
– Un MouseEvent por cada “desplazamiento infinitesimal”
� El “getSource”, “getX” y “getY” son relativos a la componente desde donde se arrastra
� Recogido por un MouseMotionListener y procesado por “mouseDragged”
– Un MouseEvent final� Recogido por un MouseListener y procesado
por “mouseRealeased”
� Ejemplo» “Movimientos-Ratón”
15
Applets
� Interfaces de usuario que se muestran en navegadores Web. » Análogos a JFrame, aunque:
– Su tamaño es fijo en la página web– No tienen los permisos que una interfaz
de usuario normal creada dentro del método “main”
� Por seguridad
– No tienen método “main”. Se define una subclase de “JApplet” y el navegador ejecuta:
� 1) El constructor “JApplet()”� 2) Métodos “init”, “start”, “stop”, “destroy”
cuando corresponda
16
Dentro de una páginaWeb
� Un applet se incluye en unapágina Web entre código HTML:
<HTML><HEAD>
<TITLE> Una página con un applet
</TITLE></HEAD><BODY>
A continuación aparece el applet:<APPLET
CODE=“MiApplet2.class”WIDTH=350 HEIGHT=200>
</APPLET></BODY>
</HTML>
Fichero ejemplo.html
18
Jerarquía de clases
� Jerarquía
1. java.lang.Object2. java.awt.Component
3. java.awt.Container4. java.awt.Panel
5. java.applet.Applet
6. javax.swing.JApplet
19
Características generales
� No necesita método main; se extiende la clase JApplet
� Los simuladores de applets(“appletviewers”) emulan a applets.» Desde línea de comandos:
– “appletviewer ejemplo.html”� ignora el código html fuera de
<applet>..</applet>
– Dimensiones modificables interactivamente
� Los navegadores “Internet Explorer” y “Netscape” soportan JDK 1.1. » Al instalar una versión superior (por
ejemplo J2SK 1.4), se instala un “plug-in”para que el navegador admita applets de esa versión superior.
� Applets más convenientes en intranets (mayor velocidad de “download”).
20
Métodos característicos de un applet
� Dentro de la clase JApplet:» init() :
– Inicialización de una página en el navegador (se ejecuta una sola vez)
» start() : – Inicializacion o revisita de una página
» stop() : – Al destruir la página o abandonarla
» destroy() : – Al destruir la página
� Algunos navegadores (como Internet Explorer) no cumplen este estándar: » Destruyen el applet al abandonar una
página (haciendo también “destroy”) y reinicializan completamente el applet al revisitarla.
� Hilos generados (no estándar): » Algunos navegadores generan un hilo de
eventos por cada applet de una página y otros lo hacen de otra manera
21
Limitaciones de applets
� Dependientes del navegador. Algunas de ellas:» No pueden leer o escribir en ficheros.» Conexiones imposibles a otra
máquina distinta de la que proviene.» No puede arrancar ningún programa
en el ordenador donde se estáejecutando, ni tampoco leer sus propiedades.
� En el appletviewer aparecen menos restricciones (se pueden leer propiedades locales, ejecutar otro programa, ...)
� En Java, sin embargo, hay otros servicios que permiten ignorar estas limitaciones: » A los “signed applets” de confianza se les
puede dar los mismos privilegios que a una aplicación.
22
Sintaxis (I) para <applet>....</applet>
<APPLET [CODEBASE = codebaseURL]CODE = appletFile[ARCHIVE = JARFiles][NAME = appletInstanceName]WIDTH= pixels HEIGHT= pixels…
>[<PARAM NAME = AttributeName1
VALUE = AttributeValue1>][<PARAM NAME = AttributeName2
VALUE = AttributeValue2>]...</APPLET>
23
Sintaxis (II) para <applet>....</applet>
� El contenido del classpath son direcciones internet:» codebase
– Análogo a los directorios locales que se añaden a “Filesystems” en “Netbeans”
» archive– Análogo a los ficheros “.zip” o “.jar” que
se añaden a “Filesystems” en “Netbeans”
� Un applet puede recibir parámetros dentro de “<param> …</param>”» Análogo a los parámetros del método
“main” de una aplicación Java normal.
» Método:– public String getParameter(String name)
24
Páginas HTML dinámicas (I)
� Interfaz web» Páginas HTML
» JSP (Java Server Pages)– Comentario
� <%-- --%>
– Directiva (de página)� <% page %>
– Scriptlets (mezclables con HTML)� <% %>� <%= %> (conversión a String)
– Uso de un bean de sesión� Bean (atributos con métodos get/set)
» Javascript– Alternativa a JSP
� JSP envía al servidor y espera respuesta� Javascript ejecuta en cliente
25
Páginas HTML dinámicas (II)
� Ejemplo» “Interfaz-Web”
– Sesión � Bean
» Uso del patrón MVC (Model ViewController)
� Programación Web Visual (RapidWeb Development)» Sun Java Studio Creator
� Patrones de diseño (UML). Ejemplos:» MVC» Patrón de Fábrica Abstracta
– Ejemplo:� “Patrón-Diseño”
26
Patrones de diseño� Ejemplo:
» Patrón de “Fábrica Abstracta”
� Ejemplo: » Realización de preguntas basadas en
menús– Ejemplo 1 (estilo números)– Ejemplo 2 (estilo subcadenas)
� Implementación en Java» Ejemplo:
– “Patrón-Diseño”
27
Ejemplo 1Estilo de menús basados en números (respuesta
con un número)
Pregunta: Capital de Francia1. Londres2. Roma3. Paris4. CaracasIntroduce el numero correcto1Respuesta incorrectaPregunta: Capital de Francia1. Londres2. Roma3. Paris4. CaracasIntroduce el numero correcto3Respuesta correcta
28
Ejemplo 2Estilo de menús basados en subcadenas
(respuesta con dos primeras letras)
Pregunta: Capital de Francia- Londres- Roma- Paris- CaracasIntroduce las dos primeras letras de la solucionPaRespuesta correctaPregunta: Capital de Francia- Londres- Roma- Paris- CaracasIntroduce las dos primeras letras de la solucionCaRespuesta incorrecta
29
Método main
int main(int argc, char* argv[]){
<Creación de una fábrica de menús de números> // Ejemplo 1// Ejemplo 2: Utilización del patrón: // <Creación de una fábrica de menús de subcadenas><Creación por la fábrica de un menú ><Crear la pregunta "Capital de Francia" para el menú><Crear la opción "Londres" para el menú><Crear la opción "Roma" para el menú><Crear la opción "París" para el menú, como la correcta><Crear la opción "Caracas" para el menú><repetir dos veces>
<Ejecutar la acción “preguntar” en el menú>
<Ejecutar la acción “responder” en el menú><fin de repetición>
}
30
Diagrama de clases
MenuDeNumeros+preguntar(): void
Menu#elementos: vector<string>#solucion: string#pregunta: string#respuesta+crearPregunta(s:string): void+crearNuevaOpcion(string,correcta:int): void+responder(): void+preguntar()
FabricaDeMenus+crearMenu(): Menu
FabricaDeMenusDeSubcadenas
+crearMenu(): Menu
MenuDeSubcadenas
+preguntar(): void
FabricaDeMenusDeNumeros
+crearMenu(): Menu