JFo 9 3 SG Esp
JFo 9 3 SG Esp
JFo 9 3 SG Esp
Java Foundations
9-3
Gráficos, audio y MouseEvents
Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 2
2
Objetivos
• En esta lección se abordan los siguientes objetivos:
−Crear y usar una imagen JavaFX y un objeto ImageView
−Crear y usar audio JavaFX
−Crear y usar MouseEvents
−Comprender las expresiones Lambda en aplicaciones
de GUI
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 3
3
Temas
• Gráficos
• Audio
• Eventos del mouse
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 4
4
Uso de sus propios gráficos
• JavaFX puede proporcionar elementos de la UI,
formas y texto
−Pero, si tiene talento para el arte, puede utilizar sus propios
gráficos en lugar de los que proporciona JavaFX
• Por ejemplo:
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 5
5
Una imagen JavaFX y un objeto ImageView
• Una imagen es un objeto que describe la ubicación de
un archivo de gráficos (.png, .jpg, .gif...)
Image image;
String imagePath = "Images/Fan1.png";
image = new Image(getClass().getResource(imagePath).toString);
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 6
6
¿Por qué tener una imagen y un objeto ImageView?
• Una gran ventaja es la animación
−Las imágenes se pueden cambiar en y fuera del objeto
ImageView
• El ventilador en Java Puzzle Ball lo aprovecha
−El ventilador pasa por 2 imágenes cuando está en
funcionamiento
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 7
7
Indicaciones de un objeto ImageView
• Cómo crear imágenes:
Image image1 = new
Image(getClass().getResource("Images/fan1.png").toString());
Image image2 = new
Image(getClass().getResource("Images/fan2.png").toString());
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 8
8
Creación de objetos con las propiedades
del nodo
• Hasta ahora, hemos escrito todos los códigos JavaFX en
el método start()
−Es similar al principio del curso, en que la mayor parte del
código se escribió en el método main()
• El código orientado al objeto no se debe escribir de
esta forma
−En su lugar, los objetos deben tener campos de nodo
• Los métodos start() y main() están destinados a ser
controladores
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 9
9
Ejemplo: La clase Goal
• Fields
−private Image dukeImage;
−private ImageView dukeImageView;
• Constructor
−Toma argumentos para las posiciones x e y
−Asigna la imagen a su respectivo objeto ImageView
−Coloca dukeImageView según los argumentos x e y
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 10
El objetivo de los niveles de Java Puzzle Ball básicos y heredados es que la bola llegue a la meta.
La meta se representa visualmente como Duke. Hay muchos más campos y métodos para la
clase Goal y el constructor hace algunas cosas más de las que se describen aquí.
10
Ejercicio 1
• Importe y abra el proyecto GoalTest Observe que...
−El nodo raíz está disponible públicamente
−Hay un paquete con varios archivos de gráfico
−La clase Goal es un tipo de archivo corriente de la clase Java
• Escriba la clase Goal de acuerdo con las
especificaciones de la diapositiva anterior
−También tendrá que agregar el objeto ImageView de esta
clase al nodo raíz
• Instancie varios objetos de la clase Goal desde el
método start()
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 11
Los nodos tienen los métodos getter y setter para las propiedades como posición. Puede
obtener y definir las posiciones x e y de un objeto ImageView como haría con cualquier otro
nodo.
11
File Locations
• Asegúrese de que los archivos se encuentran en la
ubicación correcta
Image image = new Image(getClass().getResource("Images/Duke.png"));
−O a un paquete dentro de un
paquete
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 12
12
Escala de un nodo
• Es muy fácil hacer un rectángulo más amplio:
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 13
13
Escala de un nodo de forma correcta
• JavaFX es excelente para escalar gráficos
−La calidad de la imagen tiene menos probabilidades de
deteriorarse
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 14
14
Ordenación de nodos
• A veces, los probadores de Java Puzzle Ball no sabían
que su objetivo era llevar la bola hasta Duke
• Pensamos que agregar un guante de béisbol ayudaría a
solucionar el problema
• Duke y el guante son dos objetos ImageView
independientes
−Tenían que ordenarse de forma adecuada ya que el guante no
se muestra detrás de la mano
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 15
15
Ordenación de nodos de forma correcta
• El orden en el que se agregan los nodos al nodo raíz
determina el orden en que se muestran
• Los nodos agregados más tarde tapan a los nodos
agregados anteriormente
root.getChildren().addAll(gloveImageView, dukeImageView);
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 16
16
Clase Goal
• Fields
−private Image dukeImage;
−private ImageView dukeImageView;
−private Image gloveImage;
−private ImageView gloveImageView;
• Constructor
−Toma argumentos para las posiciones x e y
−Asigna cada imagen a su respectivo objeto ImageView
−Coloca dukeImageView según los argumentos x e y
−Coloca y escala gloveImageView en relación con
dukeImageView
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 17
17
Ejercicio 2
• Continúe editando el proyecto GoalTest
• Escriba la clase Goal de acuerdo con las
especificaciones de la diapositiva anterior
−El constructor también debe tomar solo dos argumentos
−Debe aparecer un guante encima de la mano de Duke
• Indicación: Los nodos, incluidos los objetos ImageView,
tienen los métodos getter y setter para las propiedades
como posición
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 18
18
Temas
• Gráficos
• Audio
• Eventos del mouse
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 19
19
Similitudes de imagen y audio
• Creación de un objeto de imagen JavaFX...
Image image = new
Image(getClass().getResource("Images/fan1.png").toString());
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 20
20
Diferencias de imagen y audio
• Un objeto de audio describe la ubicación de un archivo
de audio (.wav, .mp3...)
Audio audio = new
Audio(getClass().getResource("Audio/Note5.wav").toString());
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 21
21
Clase Goal
• Fields
−private Image dukeImage;
−private ImageView dukeImageView;
−private Image gloveImage;
−private ImageView gloveImageView;
−private Audio tone;
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 22
22
Ejercicio 3
• Continúe editando el proyecto GoalTest
• Declare un objeto de audio como campo
• Instancie el objeto de audio
−Utilice el archivo .wav en el directorio del proyecto
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 23
23
Temas
• Gráficos
• Audio
• Eventos del mouse
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 24
24
Eventos del mouse y del teclado
• Los nodos pueden detectar los eventos del mouse
y del teclado
−Se aplica también a los objetos ImageView
−No está limitado a los botones y a otros componentes de GUI
• Los métodos útiles para que esto suceda incluyen:
−setOnMouseClicked()
−setOnMouseDragged()
−setOnMouseEntered()
−setOnMouseExited()
−setOnMouseMoved()
−setOnMousePressed()
−setOnMouseReleased()
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 25
25
Expresiones lambda
• Estos métodos utilizan un argumento especial
denominado expresión Lambda:
imageView.setOnMousePressed( /*Lambda Expression*/ );
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 26
Las lambdas se introdujeron en Java SE 8. Proporcionan una sintaxis más eficaz y ordenada para
trabajar con aplicaciones de GUI y listas de ordenación.
26
Expresiones lambda como argumentos
• Cuando se combinan, obtenemos lo siguiente:
imageView.setOnMousePressed( (MouseEvent me) -> {
System.out.println("Statement 1");
System.out.println("Statement 2");
} );
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 27
27
MouseEvent
• Un objeto MouseEvent solo existe en el ámbito de la
expresión lambda
• Contiene muchas propiedades y métodos útiles:
imageView.setOnMousePressed( (MouseEvent me) -> {
System.out.println(me.getSceneX());
System.out.println(me.getSceneY());
} );
• En este ejemplo:
−me es el objeto MouseEvent
−A me se accede para imprimir las posiciones x e y del cursor
del mouse al pulsar imageView
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 28
28
Métodos MouseEvent
• getSceneX()
• getSceneY()
− Devuelve un valor double
− Devuelve la posición del cursor en la escena JavaFX
− La esquina superior izquierda de la escena es la posición (0,0)
• getScreenX()
• getScreenY()
− Devuelve un valor double
− Devuelve la posición del cursor en la pantalla de la computadora
− La esquina superior izquierda de la pantalla de la computadora es
(0,0)
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 29
29
Recepción de eventos
• Cuando escribe un código para MouseEvents
−Está indicando la recepción de un nodo para un evento
concreto
−Pero los eventos, en realidad, no tienen que producirse
• Mientras se está recibiendo el nodo...
−Puede detectar cualquier evento, en cualquier momento
• Un nodo puede recibir muchos eventos
imageView.setOnMousePressed( /*Lambda Expression*/ );
imageView.setOnMouseDragged( /*Lambda Expression*/ );
imageView.setOnMouseReleased(/*Lambda Expression*/ );
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 30
30
Ejercicio 4
• Continúe editando el proyecto GoalTest
• Complete el método interactions() para que...
−Duke reciba una pulsación del mouse y un arrastre del mouse
−Se reproduzca un sonido al pulsar el mouse
−Se impriman las posiciones x e y del evento arrastrado del
mouse. Esto resultará útil para el juego de problemas
• ¿Qué pasa si nunca se llama a interactions()?
−Comente esta llamada de método en el constructor
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 31
31
Resumen
• En esta lección, debe haber aprendido lo siguiente:
−Crear y usar una imagen JavaFX y un objeto ImageView
−Crear y usar audio JavaFX
−Crear y usar MouseEvents
−Comprender las expresiones Lambda en aplicaciones
de GUI
Java
Foundations
JFo 9-3
Gráficos, audio y MouseEvents Copyright © 2020, Oracle y/o sus filiales. Todos los derechos reservados. 32
32
33