Desarrollo de Aplicaciones en Java INF 473 Desarrollo de Interfaces Gráficas Componentes Swing III Prof. José Miguel Rubio jose.rubio.l@ucv.cl jrubio@inf.ucv.cl 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