desarrollo de aplicaciones en java inf 473zeus.inf.ucv.cl/~jrubio/docs/2009-01/ici...

32
0 Desarrollo de Aplicaciones en Java INF 473 Prof. José Miguel Rubio [email protected] [email protected] PUCV Marzo 2008 Desarrollo de Interfaces Gráficas Componentes Swing III

Upload: nguyenhanh

Post on 08-Oct-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

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

1

Menús (I)� Ejemplo:

» “Menús”

� Jerarquía:

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)

5

Ejemplo

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”

10

Ejemplo

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”

14

Ejemplo

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

17

Ejemplo

Ejemplo: “Applets”

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

31

Diagrama de secuencia

unaFabricaDeMenusDe Numeros

unMenuDeNumeros

unUsuario

crearMenunew

crearPregunta

* crearNuevaOpcion

preguntar

responder

new