Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prog10 Vi
Prog10 Vi
Caso práctico
Ana está cursando el módulo de Programación.
Hasta ahora, las aplicaciones de ejemplo que habían realizado, estaban en modo
consola, o modo carácter, y están contentos porque están viendo las
posibilidades que se les abren ahora. Están comprobando que podrán dar a sus
aplicaciones un aspecto mucho más agradable para el usuario. Ana le comenta
a José Javier:
1 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
1.- Introducción.
Hoy en día las interfaces de los programas son cada vez más sofisticadas y
atractivas par el usuario. Son intuitivas y cada vez más fáciles de usar: pantallas
táctiles, etc.
Así que, con el tiempo, con la idea de simplificar el uso de los jdlasica (CC BY-NC)
En ocasiones verás otras definiciones de interfaz, como la que define una interfaz como un
dispositivo que permite comunicar dos sistemas que no hablan el mismo lenguaje. También se
emplea el término interfaz para definir el juego de conexiones y dispositivos que hacen posible
la comunicación entre dos sistemas.
Aquí en este módulo, cuando hablamos de interfaz nos referimos a la cara visible de los
programas tal y como se presenta a los usuarios para que interactúen con la máquina. La
interfaz gráfica implica la presencia de un monitor de ordenador, en el que veremos la interfaz
constituida por una serie de menús e iconos que representan las opciones que el usuario
puede tomar dentro del sistema.
En 1981 aparecieron los primeros ordenadores personales, los llamados PC, pero
hasta 1993 no se generalizaron las interfaces gráficas de usuario. El escritorio del
sistema operativo Windows de Microsoft y su sistema de ventanas sobre la pantalla
se ha estandarizado y universalizado, pero fueron los ordenadores Macintosh de la
compañía Apple los pioneros en introducir las interfaces gráficas de usuario.
2 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
diverso software, entre ellos, el de las GUI de MAC OS, o de Windows en las
sucesivas versiones
Autoevaluación
Señala la opción correcta acerca de las interfaces gráficas de usuario:
Son sinónimos de ficheros de texto.
Las ventanas de una aplicación no serían un ejemplo de elemento de
interfaz gráfica de usuario.
Surgen con la idea de facilitar la interactuación del usuario con la máquina.
Ninguna es correcta.
¡Exacto! Se pretendía con ellas que cada vez más gente usara las
computadoras.
Solución
1. Incorrecto
2. Incorrecto
3. Opción correcta
4. Incorrecto
3 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Caso práctico
José Javier está un poco abrumado por la cantidad de
componentes que tiene Java para desarrollar interfaces
gráficos. Piensa que hay tantos, que son tantas clases,
que nunca podrá aprendérselos. Ana le dice:
Hemos visto que la interfaz gráfica de usuario es la parte del programa que permite al usuario
interaccionar con él. Pero, ¿cómo la podemos crear en Java?
El API de Java proporciona una librería de clases para el desarrollo de interfaces gráficas de
usuario (en realidad son dos: AWT y Swing). Esas librerías se engloban bajo los nombres de
AWT y Swing, que a su vez forman parte de las Java Foundation Classes o JFC. AWT es
una librería ya en desuso y en la actualidad Swing está siendo desplazado por JavaFX,
plataforma que permite el desarrollo de interfaces gráficas de usuario con grandes
prestaciones y ejecutables en cualquier plataforma (pc, móviles, web, etc). JavaFX es una
tecnología de Oracle que no está incluída en JDK pero está a disposición de los usuarios que
deseen utilizarla. Sin duda JavaFX marcará el futuro de las interfaces gráficas en Java, pues
además es compatible con componentes Swing.
Entre las clases de las JFC hay un grupo de elementos importante que ayuda a la
construcción de interfaces gráficas de usuario (GUI) en Java.
4 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Autoevaluación
Señala la opción incorrecta. JFC se consta de los siguientes elementos:
Componentes Swing.
Soporte de diversos "look and feel".
Soporte de impresión.
Interfaz de programación Java 3D.
Solución
5 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
1. Incorrecto
2. Incorrecto
3. Incorrecto
4. Opción correcta
6 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
2.1.- Swing.
Cuando se vio que era necesario mejorar las características
que ofrecía AWT, distintas empresas empezaron a sacar sus
controles propios para mejorar algunas de las
características de AWT. Así, Netscape sacó una librería de
clases llamada Internet Foundation Classes para usar con
Java, y eso obligó a Sun (todavía no adquirida por Oracle) a
José Javier Bermúdez Hernández (CC BY-NC)
reaccionar para adaptar el lenguaje a las nuevas necesidades.
Swing se apoya sobre AWT y añade JComponents. La arquitectura de los componentes de Swing
facilita la personalización de apariencia y comportamiento, si lo comparamos con los
componentes AWT.
La razón por la que no existe JCanvas es que los paneles de la clase JPanel ya soportan todo lo
que el componente Canvas de AWT soportaba. No se consideró necesario añadir un
componente Swing JCanvas por separado.
7 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
8 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
2.2.- JavaFX
JavaFX es una tecnología Java para el diseño de aplicaciones con interfaces gráficas
interactivas multiplataforma. Las aplicaciones JavaFx pueden ser ejecutadas con el mismo
resultado en multitud de dispositivos: pc, móviles, tv, consolas, etc. JavaFX amplía la potencia
de Java permitiendo a los desarrolladores utilizar cualquier biblioteca de Java en aplicaciones
JavaFX. Los desarrolladores pueden ampliar sus capacidades en Java y utilizar la tecnología
de presentación que JavaFX proporciona para crear experiencias visuales que resulten
atractivas.
El JavaFX no está incluido en el SDK estándar desde la version 11. Sin embargo, proporciona
dispone de su propia kit de desarrollo, en concreto, JavaFX SDK 14 en la última versión. Está
formada por un conjunto de clases y API junto con un editor gráfico Scene Builder para crear
las interfaces visualmente.
Java APIs: las APIs están escritas en código nativo Java compatibles con otros
lenguajes soportados por la máquina virtual.
FXML and Scene Builder: FXML es un lenguaje de marcado que describe las interfaces
de usuario. Se pueden escribir directamente o usar la herramienta JavaFX Scene Builder
para crearlos con una interfaz gráfica.
WebView: permite embeber páginas HTML en las aplicaciones JavaFX. Ofrece soporte
para JavaScript.
Built-in UI controls and CSS: proporciona cantidad de controles para construir
aplicaciones completas. El estilo de los controles puede ser modificado con CSS.
Canvas API: para dibujar directamente en la pantalla.
Multitouch Support: soporte para gestos táctiles múltiples en función de las
posibilidades de la plataforma subyacente.
Hardware-accelerated graphics pipeline: haciendo uso de la GPU se consiguen
animaciones gráficas fluidas en las tarjetas gráficas soportadas, si la gráfica no está
soportada de hace uso de la pila de software Java2D.
High-performance media engine: soporta la reproducción de contenido multimedia con
baja latencia basándose en GStreamer.
Self-contained application deployment model: las aplicaciones contenidas tiene todos
los recursos y una copia privada de los entornos de ejecución de Java y JavaFX. Son
distribuidos como paquetes instalables y proporcionan la misma experiencia de
instalación e inicio que las aplicaciones nativas del sistema operativo.
9 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Debes conocer
Aunque utilicemos herramientas de diseño de interfaces Swing,
independientemente del entorno de desarrollo utilizado, debemos entender
mínimamente el código Java generado. En ciertas ocasiones puede ser útil hacer
pequeñas modificaciones a través de código.
Recomendación
La mejor forma de aprender a diseñar, construir y añadir funcionalidad a
interfaces Java es diseñándolas. Por eso, te animanos a que pruebes cada uno
de los ejemplos que se utilizan además de tratar de implementar funcionalidades
que se te ocurran.
10 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Caso práctico
—Pero si esto lo podría hacer hasta mi sobrino pequeño,… — piensa para sí.
Crear aplicaciones que incluyan interfaces gráficos de usuario, con NetBeans, es muy sencillo
debido a las facilidades que nos proporcionan sus asistentes y herramientas.
Modo de diseño libre (Free Design): permite mover libremente los componentes de
interfaz de usuario sobre el panel o marco, sin atenerse a uno de los layouts por defecto.
Un layout define la posición de los elementos de un panel.
Independencia de plataforma: diseñando de la manera más fácil, es decir, arrastrando y
soltando componentes desde la paleta al área de diseño visual, el NetBeans sugiere
alineación, posición, y dimensión de los componentes, de manera que se ajusten para
cualquier plataforma, y en tiempo de ejecución el resultado sea el óptimo, sin importar el
sistema operativo donde se ejecute la aplicación.
Soporte de internacionalización: Se pueden internacionalizar las aplicaciones Swing,
aportando las traducciones de cadenas de caracteres, imágenes, etc., sin necesidad de
tener que reconstruir el proyecto, sin tener que compilarlo según el país al que vaya
dirigido. Se puede utilizar esta características empleando ficheros de recursos
11 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
(ResourceBundle files). En ellos, deberíamos aportar todos los textos visibles, como el
texto de etiquetas, campos de texto, botones, etc. NetBeans proporciona una asistente
de internacionalización desde el menú de herramientas (Tools).
Autoevaluación
Verdadero
En efecto, NetBeans ayuda de esa manera, siendo de gran ayuda en la
gestión de eventos de las aplicaciones.
12 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Crear un proyecto.
Construir la interfaz con el usuario.
Añadir funcionalidad, en base a la lógica de negocio que se requiera.
Ejecutar el programa.
Primero, crea el proyecto de la manera tan simple como puedes ver en:
1 2 3 4 ►
13 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
14 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
A continuación, vamos a crear la interfaz. Se tratará de una ventana con tres campos de
texto y varios botones. Obsérvalo en la siguiente presentación:
1 2 3 4 5 6 7 8 ►
15 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
En primer lugar, añade un JPanel a la ventana. Para ello solo tendrás que pulsar sobre
el elemento Panel en la paleta y a continuación colocarlo en la ventana. Un panel es
un elemento contenedor donde colocamos otros elementos.
16 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
17 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
• Los campos de texto no deben mostrar nada, por lo tanto, solo tienes que
eliminar el texto.
18 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
19 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Has podido comprobar que el diseño de interfaces con el editor gráfico de Netbeans es
relativamente sencillo. En otros entornos de desarrollo la forma de proceder es parecida. En
las siguientes unidades veremos cómo dar funcionalidad a nuestra aplicación.
20 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
3.2- Eventos.
Caso práctico
Ana sabe que entender cómo funciona la
programación por eventos es algo relativamente
fácil, el problema está en utilizar correctamente
los eventos más adecuados en cada momento.
Ana tiene muy claro que el evento se asocia a un
botón cuando se pulsa, pero José Javier la pone
en duda, cuando la llama por teléfono para
preguntarle unas dudas y le dice, que él cree, que
Ministerio de Educación y FP (CC BY-NC)
el evento se produce cuando el botón se suelta.
Además, le recuerda que en clase dijeron que al
ser enfocado con el ratón, o al accionar una combinación de teclas asociadas,
también se pueden producir eventos. Tras hablarlo, piensan que realmente no es
tan complicado, porque se repiten muchos eventos y si nos paramos a pensarlo,
todos ellos son predecibles y bastante lógicos.
21 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
3.2.1.- Introducción.
¿Qué es un evento?
Para abordar el problema de tratar correctamente las interacciones del usuario con la interfaz
gráfica de la aplicación hay que cambiar de estrategia, y la programación guiada por
eventos es una buena solución, veamos cómo funciona el modelo de gestión de eventos.
22 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Cada vez que el usuario realiza una determinada acción sobre una aplicación que estamos
programando en Java, un clic sobre el ratón, presionar una tecla, etc., se produce un evento
que el sistema operativo transmite a Java.
Java crea un objeto de una determinada clase de evento, y este evento se transmite a un
determinado método para que lo gestione.
Las fuentes de eventos (event sources) son objetos que detectan eventos y notifican a los
receptores que se han producido dichos eventos. Ejemplos de fuentes:
En el apartado anterior de creación de interfaces con ayuda de los asistentes del IDE, vimos lo
fácil que es realizar este tipo de programación, ya que el IDE hace muchas cosas, genera
código automáticamente por nosotros.
Pero también podríamos hacerlo nosotros todo, si no tuviéramos un IDE como NetBeans, o
porque simplemente nos apeteciera hacerlo todo desde código, sin usar asistentes ni
diseñadores gráficos. En este caso, los pasos a seguir se pueden resumir en:
1 2 3 4 5 ►
23 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
24 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
25 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Autoevaluación
26 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Falso
El programador o programadora sólo debe preocuparse de la lógica de
negocio.
27 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
de visibilidad
En contenedores: ContainerEvent. Indica que el contenido de un contenedor ha
cambiado porque se añadió o eliminó un componente.
En ventanas: WindowEvent. Indica que una ventana ha cambiado su estado.
FocusEvent, indica que un componente ha obtenido o perdido la entrada del foco.
Semánticos o de mayor nivel de abstracción: se componen de un conjunto de eventos
físicos, que se suceden en un determinado orden y tienen un significado más abstracto.
Por ejemplo: el usuario elige un elemento de una lista desplegable (ItemEvent).
ActionEvent, ItemEvent, TextEvent, AdjustmentEvent.
Autoevaluación
Verdadero
En efecto es un evento físico, tanto a un botón como a cualquier otro
componente.
28 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Causa de
Métodos más usuales Explicación
Método la
invocación
Devuelve el
carácter
Se ha char getKeyChar() asociado con
keyPressed (KeyEvent e) pulsado la tecla
una tecla. pulsada.
Devuelve el
valor entero
Se ha int getKeyCode() que
keyReleased (KeyEvent e) liberado representa la
una tecla. tecla pulsada.
Se ha Devuelve un
pulsado (y texto que
keyTyped (KeyEvent e) a veces
String getKeyText() representa el
soltado) código de la
una tecla. tecla.
Método
perteneciente
a la clase
EventObject.
Object getSource()
Indica el
objeto que
produjo el
evento.
29 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Botón en estado normal. Al pulsar la tecla se disparará el evento KeyPressed. Al liberar la tecla se genera el evento KeyReleased.
En el siguiente enlace tienes el código del proyecto que te puedes descargar. En él se puede
ver un ejemplo del uso eventos. En concreto vemos cómo se están capturando los eventos
que se producen al pulsar una tecla y liberarla. El programa escribe en un área de texto las
teclas que se oprimen.
30 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
31 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
En el siguiente vídeo puede ver el primero de una serie de cinco vídeos en los
que se realiza una calculadora con la ayuda de los asistentes de NetBeans.
32 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Autoevaluación
Verdadero Falso
Verdadero
La afirmación es correcta, ese es el evento que se dispara.
Debes conocer
En enlace este tienes un documento muy interesante, paso a paso, sobre
construcción de interfaces gráficos con NetBeans.
33 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Caso práctico
José Javier va de camino a la clase práctica en la
que él, y el resto de la clase, van a probar a hacer
sus primeros pasos en programación visual con
entornos gráficos, el profesor les explica que al
principio parece que todo es muy fácil sobre el
papel, pero en realidad crear un proyecto con
componentes gráficos no siempre es fácil. Pero el
profesor lo tiene claro, hay que empezar por los
contenedores que, como su propio nombre indica,
se emplean para contener o ubicar al resto de José Javier Bermúdez Hernández (CC BY-
NC)
componentes.
Albert Einstein
34 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
3.3.1.- Contenedores.
Por los ejemplos vistos hasta ahora, ya te habrás dado
cuenta de la necesidad de que cada aplicación "contenga"
de alguna forma esos componentes. ¿Qué componentes se
usan para contener a los demás?
Cualquier aplicación, con interfaz gráfico de usuario típica, comienza con la apertura de una
ventana principal, que suele contener la barra de título, los botones de minimizar,
maximizar/restaurar y cerrar, y unos bordes que delimitan su tamaño.
Esa ventana constituye un marco dentro del cual se van colocando el resto de componentes
que necesita el programador: menú, barras de herramientas, barra de estado, botones, casillas
de verificación, cuadros de texto, etc.
Toda aplicación de interfaz gráfica de usuario Java tiene, al menos, un contenedor de alto
nivel.
Los contenedores de alto nivel extienden directamente a una clase similar de AWT, es decir,
JFrame extiende de Frame. Es decir, realmente necesitan crear una ventana del sistema operativo
independiente para cada uno de ellos.
Los demás componentes de la aplicación no tienen su propia ventana del sistema operativo,
sino que se dibujan en su objeto contenedor.
En los ejemplos anteriores del tema, hemos visto que podemos añadir un JFrame desde el
diseñador de NetBeans, o bien escribiéndolo directamente por código. De igual forma para los
componentes que añadamos sobre el.
JFrame y JDialog
35 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Autoevaluación
Falso
Sólo lo necesitan los contenedores de alto nivel.
36 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Cuando quieres terminar la ejecución de un programa, ¿qué sueles hacer? Pues normalmente
pinchar en el icono de cierre de la ventana de la aplicación.
En Swing, una cosa es cerrar una ventana, y otra es que esa ventana deje de existir
completamente, o cerrar la aplicación completamente.
Se puede hacer que una ventana no esté visible, y sin embargo que ésta siga
existiendo y ocupando memoria para todos sus componentes, usando el método
setVisible(false). En este caso bastaría ejecutar para el JFrame el método setVisible(true) para
volver a ver la ventana con todos sus elementos.
Si queremos cerrar la aplicación, es decir, que no sólo se destruya la ventana en la que
se mostraba, sino que se destruyan y liberen todos los recursos (memoria y CPU) que
esa aplicación tenía reservados, tenemos que invocar al método System.exit(0).
También se puede invocar para la ventana JFrame al método dispose(), heredado de la
clase Window, que no requiere ningún argumento, y que borra todos los recursos de
pantalla usados por esta ventana y por sus componentes, así como cualquier otra
ventana que se haya abierto como hija de esta (dependiente de esta). Cualquier
memoria que ocupara esta ventana y sus componentes se libera y se devuelve al sistema
operativo, y tanto la ventana como sus componentes se marcan como "no
representables". Y sin embargo, el objeto ventana sigue existiendo, y podría ser
reconstruido invocando al método pack() o la método show(), aunque deberían construir de
nuevo toda la ventana.
Las ventanas JFrame de Swing permiten establecer una operación de cierre por defecto con el
método setDefaultCloseOperation(), definido en la clase JFrame.
¿Cómo se le indica al método el modo de cerrar la ventana?
Los valores que se le pueden pasar como parámetros a este método son una serie de
constantes de clase:
Autoevaluación
Verdadero Falso
37 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Falso
En efecto, sí que libera también esos recursos.
38 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
En algunos entornos los componentes se colocan con José Javier Bermúdez Hernández (CC
coordenadas absolutas. En Java se desaconseja esa práctica BY-NC)
Debemos hacer un buen diseño de la interfaz gráfica, y así tenemos que elegir el mejor gestor
de distribución para cada uno de los contenedores o paneles de nuestra ventana.
Esto podemos conseguirlo con el método setLayout(), al que se le pasa como argumento un
objeto del tipo de Layout que se quiere establecer.
En NetBeans, una vez insertado un JFrame, si nos situamos sobre él y pulsamos botón derecho,
se puede ver, como muestra la imagen, que aparece un menú, el cual nos permite elegir el
layout que queramos.
Debes conocer
En la siguiente web puedes ver gráficamente los distintos layouts:
Ejemplos de layouts
Autoevaluación
39 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Falso
¡No se aconseja utilizar coordenadas absolutas!
40 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Con NetBeans es tan fácil como arrastrar tantos controles JPanel de la paleta hasta el JFrame. Por
código, también es muy sencillo, por ejemplo podríamos crear un panel rojo, darle sus
características y añadirlo al JFrame del siguiente modo:
Cuando en Sun desarrollaron Java, los diseñadores de Swing, por alguna circunstancia,
determinaron que para algunas funciones, como añadir un JComponent, los programadores no
pudiéramos usar JFrame.add, sino que en lugar de ello, primeramente, tuviéramos que obtener el
objeto Container asociado con JFrame.getContentPane(), y añadirlo.
Sun se dio cuenta del error y ahora permite utilizar JFrame.add, desde Java 1.5 en adelante. Sin
embargo, podemos tener el problema de que un código desarrollado y ejecutado
correctamente en 1.5 falle en máquinas que tengan instalado 1.4 o anteriores.
Paneles
41 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
El componente Swing etiqueta JLabel, se utiliza para crear etiquetas de modo que podamos
insertarlas en un marco o un panel para visualizar un texto estático, que no puede editar el
usuario.
Los constructores son:
Propiedades de JLabel
Propiedades de JTextField
Autoevaluación
42 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Verdadero Falso
Falso
No se puede cambiar puesto que es un texto estático.
43 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
3.3.6.- Botones.
Ya has podido comprobar que prácticamente todas las
aplicaciones incluyen botones que al ser pulsados efectúan
alguna acción: hacer un cálculo, dar de alta un libro, aceptar
modificaciones, etc.
Hay un tipo especial de botones, que se comportan como interruptores de dos posiciones o
estados (pulsados-on, no pulsados-off). Esos botones especiales se denominan botones
on/off o JToggleButton.
JButton
44 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
JButtonGrouppermite agrupar una serie de casillas de verificación (JRadioButton), de entre las que
sólo puede seleccionarse una. Marcar una de las casillas implica que el resto sean
desmarcadas automáticamente. La forma de hacerlo consiste en añadir un JButtonGroup y luego,
agregarle los botones.
Autoevaluación
Verdadero
Así es, presentan esos dos estados.
45 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
3.3.8.- Listas.
Vemos a continuación un ejemplo parar crear una lista JList que muestra las cadenas
contenidas en el vector info[]:
/* El valor de la propiedad model de JList es un objeto que proporciona una visión de sólo lectura del
El método getModel() permite recoger ese modelo en forma de Vector de objetos, y utilizar con los méto
System.out.println(listaDatos.getModel().getElementAt(i));
En el enlace que tienes a continuación puedes ver un vídeo que muestra cómo
46 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
47 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Como hemos comentado, los datos se almacenan en un modelo que al fin y al cabo es un
vector, por lo que tiene sentido hablar de índice seleccionado.
También se dispone de un método getSelectedIndex() con el que podemos averiguar el índice del
elemento seleccionado.
El método getSelectecValue() devuelve el objeto seleccionado, de tipo Object, sobre el que tendremos
que aplicar un "casting" explícito para obtener el elemento que realmente contiene la lista (por
ejemplo un String). Observa que la potencia de usar como modelo un vector de Object, es que en
el JList podemos mostrar realmente cualquier cosa, como por ejemplo, una imagen.
Autoevaluación
48 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Verdadero Falso
Falso
Se puede usar MULTIPLE_INTERVAL_SELECTION para seleccionar varios
elementos no contiguos.
49 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Ejemplo JComboBox
50 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
3.3.11.- Menús.
En las aplicaciones informáticas siempre se intenta que el usuario
disponga de un menú para facilitar la localización una operación. La
filosofía, al crear un menú, es que contenga todas las acciones que el
usuario pueda realizar en la aplicación. Lo más normal y útil es
hacerlo clasificando o agrupando las operaciones por categorías en
submenús.
Podemos construir por código un menú sencillo como el de la imagen con las siguientes
sentencias:
menu.add(opcionAbrir);
menu.add(opcionguardar);
menu.add(opcionSalir);
barra.add(menu);
// Establecer la barra
setJMenuBar(barra);
Frecuentemente, dispondremos de alguna opción dentro de un menú, que al elegirla, nos dará
paso a un conjunto más amplio de opciones posibles.
51 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Cuando en un menú un elemento del mismo es a su vez un menú, se indica con una flechita al
final de esa opción, de forma que se sepa que, al seleccionarla, nos abrirá un nuevo menú.
Para incluir un menú como submenú de otro basta con incluir como ítem del menú, un objeto
que también sea un menú, es decir, incluir dentro del JMenu un elemento de tipo JMenu.
Menús en Java
Autoevaluación
Verdadero Falso
Falso
Para crear un menú no nos hace falta ningún JList.
52 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
3.10.12.- Separadores.
A veces, en un menú pueden aparecer distintas opciones. Por ello,
nos puede interesar destacar un determinado grupo de opciones o
elementos del menú como relacionados entre sí por referirse a un
mismo tema, o simplemente para separarlos de otros que no tienen
ninguna relación con ellos.
componente.
Al código anterior, tan sólo habría que añadirle una línea, la que resaltamos en negrita:
...
menu.add(opcionguardar);
menu.add(new JSeparator());
...
Autoevaluación
Falso
Para crear un menú no es necesario que haya separador forzosamente.
53 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Ejercicio Resuelto
En el siguiente enlace tienes a tu disposición decenas de ejemplos de
componentes Swing elaborados por Oracle. Para cada ejemplo contiene un
proyecto Netbeans, los ficheros fuentes Java o incluso pueden ser lanzados de
forma remota para ver su aspecto.
54 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
4.- JavaFX
Con JavaFX se pueden crear muchos tipos de aplicaciones. Por lo general, son aplicaciones
que cumplen con los requisitos de ejecución en múltiples plataformas y muestran información
en una interfaz de usuario moderna de alto rendimiento que incluye audio, vídeo, gráficos y
animación. Esta tecnología aumenta la productividad y mejora la mantenibilidad de nuestras
interfaces de usuario, mantenimiento de forma separada los ficheros que implementan la
lógica de negocio de los que contienen el diseño de las interfaces. En este sentido, JavaFX
supera con creces las posibilidades con respecto Swing, donde crear una simple animación o
dar un aspecto semiprofesional es una tarea tedioasa y no demasiado simple.
JavaFX
55 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Antes de trabajar con JavaFX debemos instalar el JavaFX SDK en nuestro sistema operativo.
Observa en la siguiente presentación los pasos a seguir para la descarga e instalación:
1 2 3 4 5 ►
56 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
57 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
58 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
59 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
1 2 3 4 5 6 7 8 ►
60 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
61 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
62 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
63 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
64 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
65 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
66 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
3. En las líneas del 20 a 23 se crea una escena con un determinado tamaño. Se añade un
título al Stage, se le añade la escena creada y se hace visible.
67 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
redimensionado el Stage.
5. El nodo raiz contiene un nodo hijo, un botón con texto, con un manejador de eventos
que imprime un mensaje cuando el botón es pulsado.
68 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
1 2 3 ►
Una vez descargado, ejecuta el fichero de instalación y sigue los pasos. Es un proceso
muy sencillo.
69 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Integrar Scene Builder en Netbeans es fácil. Una vez instalado, tan solo tendremos
que decirle a Netbeans en qué ruta se encuentra instalado. Para ello, debemos
acceder a las preferencias de Netbeans y configurar el parámetro que se observa en la
imagen:
70 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
1 2 3 4 5 6 7 8 9 10 11 12 ►
El siguiente paso será crear, tal y como hicimos en el proyecto anterior, una clase
principal JavaFX. Una vez creada, eliminamos el código del método start.
71 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Para ello, en el paquete por defecto, seleccionamos en Netbeans New - Empty FXML.
Aparecerá la siguiente ventana:
72 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
73 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Parte de este código ya nos es familiar, pues se crea la escena y se asocia al Stage. En
la primera línea del código, a través del FXMLLoader, indicamos que cargue nuestro
fichero fxml. En nuestra "primera aplicación JavaFX" creamos la interfaz a través de
código Java y en este caso lo haremos a través de nuestro fichero fxml, que editamos
con Scene Builder.
74 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
75 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
num1= Integer.parseInt(tfNumero1.getText());
num2= Integer.parseInt(tfNumero2.getText());
//Ya hemos recogido el valor de los operados de los campos de texto de la interfaz. R
resul=num1+num2;
tfResultado.setText(String.valueOf(resul));
}
@FXML
private void buttonSalirHandler (ActionEvent event){
System.exit(0);
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
1. Declaramos una referencia a cada uno de los elementos de las interfaz a los que
tenemos que acceder desde el controlador. Para ello utilizamos la etiqueta
@FXML (incluir el import si hay errores de compilación). Evidentemente, hemos
de asignar un nombre a cada referencia. En nuestro caso, necesitamos acceder a
los tres campos de texto: a dos de ellos para recuperar los valores de los
números a sumar (tfNumero1 y tfNumero2) y el tercero para mostrar el resultado
(tfResultado). Observa que esas referencia son del tipo de objeto que utilizamos
al incluir el elemento en la interfaz, en nuestro caso, TextField. Líneas 3-10.
2. A continuación, declaramos un método que va a actuar como manejador de
eventos del botón Sumar. Se encargará de realizar la suma y mostrar el
resultado en el campo de texto apropiado. El nombre del método lo decidimos
nosotros.
3. Creamos un tercer método que se encargará de manejar eventos producidos por
el botón Salir.
76 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
77 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
78 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Al evento OnAction del botón, que se lanzará cuando el botón sea pulsado, le
asociamos el manejador buttonSumarHandler, que previamente hemos definido en el
controlador.
79 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Minicalculadora JavaFX
80 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
81 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
Recomendación
En la web de JavaFX, hay multitud de proyectos JavaFX que pueden ser
integrados en nuestros propios proyectos. Puede ser muy interesantes pues
aportar funcionalidad que no tendríamos que implementar.
Web de JavaFX
82 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
5.- Conclusiones
A lo largo de esta unidad hemos trabajado con una parte importante de cualquier aplicación
software, la interfaz de usuario. Hemos aprendido las dos librerías de Java para el
desarrollo de interfaces: Swing, ya en desuso y JavaFX, que permite crear interfaces
mas modernas que la anterior. Evidentemente aprender en profundidad estas librerías
supondría dedicar casi la totalidad de horas de un módulo. El objetivo es hacer una
introducción al funcionamiento de estas librerías.
Para terminar el curso, trabajaremos con bases de datos relacionales y haremos una pequeña
introducción a las bases de datos orientadas a objeto.
83 de 84 18/8/21 13:08
UD10.- Comunicándonos con el usuario. Interfaces. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_nvPBZI/P...
84 de 84 18/8/21 13:08