Download Swing 3

Document related concepts
no text concepts found
Transcript
Desarrollo de Aplicaciones en
Java
INF 473
Desarrollo de Interfaces Gráficas
Componentes Swing III
Prof. José Miguel Rubio
[email protected]
[email protected]
PUCV
Marzo 2008
0
Menús (I)
Ejemplo:
» “Menús”
Jerarquía:
1
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(JMenuBar
menubar)
» 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,
2
int y)
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
3
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)
4
Ejemplo
5
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, int
x, int y)
public abstract void fillOval(int x, int y, int
width, int height)
public void drawRect(int x, int y, int width, int
height)
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()
6
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
7
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“
8
Imágenes y animaciones
Creación de imágenes:
» Clase Graphics
public abstract boolean drawImage(Image
img, 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”
9
Ejemplo
10
Movimientos de ratón
(I)
Clase java.awt.event.MouseEvent
» Constructor
public MouseEvent(Component source, int
id, long when, int modifiers, int x, int y, int
clickCount, 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)
11
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”
12
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”
13
Ejemplo
14
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
15
Dentro de una página
Web
Un applet se incluye en una
página Web entre código HTML:
Fichero ejemplo.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>
16
Ejemplo
Ejemplo: “Applets”
17
Jerarquía de clases
Jerarquía
1.
2.
3.
4.
5.
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Panel
java.applet.Applet
6. javax.swing.JApplet
18
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”).
19
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
20
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
21
aplicación.
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>
22
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)
23
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
24
Páginas HTML
dinámicas (II)
Ejemplo
» “Interfaz-Web”
– Sesión Bean
» Uso del patrón MVC (Model View
Controller)
Programación Web Visual (Rapid
Web Development)
» Sun Java Studio Creator
Patrones de diseño (UML).
Ejemplos:
» MVC
» Patrón de Fábrica Abstracta
– Ejemplo:
“Patrón-Diseño”
25
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”
26
Ejemplo 1
Estilo de menús basados en números (respuesta
con un número)
Pregunta: Capital de Francia
1. Londres
2. Roma
3. Paris
4. Caracas
Introduce el numero correcto
1
Respuesta incorrecta
Pregunta: Capital de Francia
1. Londres
2. Roma
3. Paris
4. Caracas
Introduce el numero correcto
3
Respuesta correcta
27
Ejemplo 2
Estilo de menús basados en subcadenas
(respuesta
con dos primeras letras)
Pregunta: Capital de Francia
- Londres
- Roma
- Paris
- Caracas
Introduce las dos primeras letras de la solucion
Pa
Respuesta correcta
Pregunta: Capital de Francia
- Londres
- Roma
- Paris
- Caracas
Introduce las dos primeras letras de la solucion
Ca
Respuesta incorrecta
28
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>
}
29
Diagrama de clases
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
FabricaDeMenusDeNumeros
MenuDeNumeros
+crearMenu(): Menu
+preguntar(): void
MenuDeSubcadenas
+preguntar(): void
30
Diagrama de
secuencia
un
Usuario
new
una
FabricaDeMenusDe Numeros
crearMenu
new
un
MenuDeNumeros
crearPregunta
* crearNuevaOpcion
preguntar
responder
31