JavaFX - Tratamento de Eventos
Em JavaFX, podemos desenvolver aplicativos GUI, aplicativos da web e aplicativos gráficos. Em tais aplicativos, sempre que um usuário interage com o aplicativo (nós), é dito que um evento ocorreu.
Por exemplo, clicar em um botão, mover o mouse, inserir um caractere pelo teclado, selecionar um item da lista, rolar a página são as atividades que fazem com que um evento aconteça.
Tipos de Eventos
Os eventos podem ser amplamente classificados nas duas categorias a seguir -
Foreground Events- Aqueles eventos que requerem a interação direta de um usuário. Eles são gerados como conseqüências da interação de uma pessoa com os componentes gráficos em uma Interface Gráfica de Usuário. Por exemplo, clicar em um botão, mover o mouse, inserir um caractere pelo teclado, selecionar um item da lista, rolar a página, etc.
Background Events- Aqueles eventos que requerem a interação do usuário final são conhecidos como eventos de segundo plano. As interrupções do sistema operacional, falha de hardware ou software, expiração do temporizador, conclusão da operação são exemplos de eventos em segundo plano.
Eventos em JavaFX
O JavaFX fornece suporte para lidar com uma ampla variedade de eventos. A classe chamadaEvent do pacote javafx.event é a classe base para um evento.
Uma instância de qualquer uma de suas subclasses é um evento. O JavaFX oferece uma ampla variedade de eventos. Alguns deles estão listados abaixo.
Mouse Event- Este é um evento de entrada que ocorre quando um mouse é clicado. É representado pela classe chamadaMouseEvent. Inclui ações como clicar com o mouse, pressionar o mouse, liberar o mouse, mover o mouse, entrar no alvo, sair do alvo, etc.
Key Event- Este é um evento de entrada que indica que o toque da tecla ocorreu em um nó. É representado pela classe chamadaKeyEvent. Este evento inclui ações como tecla pressionada, tecla liberada e tecla digitada.
Drag Event- Este é um evento de entrada que ocorre quando o mouse é arrastado. É representado pela classe chamadaDragEvent. Inclui ações como arrastar inserido, arrastar e soltar, arrastar alvo inserido, arrastar e sair do alvo, arrastar, etc.
Window Event- Este é um evento relacionado às ações de exibição / ocultação de janela. É representado pela classe chamadaWindowEvent. Inclui ações como ocultar janela, janela exibida, janela oculta, exibição de janela, etc.
Manipulação de eventos
Manipulação de eventos é o mecanismo que controla o evento e decide o que deve acontecer, se um evento ocorrer. Este mecanismo possui o código conhecido como manipulador de eventos, que é executado quando ocorre um evento.
JavaFX fornece manipuladores e filtros para manipular eventos. Em JavaFX, todo evento tem -
Target- O nó em que ocorreu um evento. Um alvo pode ser uma janela, cena e um nó.
Source- A fonte de onde o evento é gerado será a fonte do evento. No cenário acima, o mouse é a fonte do evento.
Type- Tipo de evento ocorrido; no caso de evento de mouse - mouse pressionado, mouse liberado são os tipos de eventos.
Suponha que temos um aplicativo que tem os botões Círculo, Parar e Reproduzir inseridos usando um objeto de grupo da seguinte forma -
Se você clicar no botão play, a origem será o mouse, o nó de destino será o botão play e o tipo de evento gerado é o clique do mouse.
Fases de manipulação de eventos em JavaFX
Sempre que um evento é gerado, o JavaFX passa pelas seguintes fases.
Construção de rota
Sempre que um evento é gerado, a rota padrão / inicial do evento é determinada pela construção de um Event Dispatch chain. É o caminho do estágio ao Nó de origem.
A seguir está a cadeia de envio de eventos para o evento gerado, quando clicamos no botão play no cenário acima.
Fase de Captura de Evento
Após a construção da cadeia de despacho de evento, o nó raiz do aplicativo despacha o evento. Este evento viaja para todos os nós na cadeia de despacho (de cima para baixo). Se algum desses nós tiver umfilterregistrado para o evento gerado, ele será executado. Se nenhum dos nós na cadeia de despacho tiver um filtro para o evento gerado, ele será passado para o nó de destino e, finalmente, o nó de destino processará o evento.
Fase de bolhas de eventos
Na fase de bolha do evento, o evento é viajado do nó de destino para o nó do estágio (de baixo para cima). Se algum dos nós na cadeia de despacho de evento tiver umhandlerregistrado para o evento gerado, ele será executado. Se nenhum desses nós tiver manipuladores para manipular o evento, o evento alcançará o nó raiz e, finalmente, o processo será concluído.
Manipuladores e filtros de eventos
Filtros e manipuladores de eventos são aqueles que contêm lógica de aplicativo para processar um evento. Um nó pode se registrar em mais de um manipulador / filtro. No caso de nós pai-filho, você pode fornecer um filtro / manipulador comum aos pais, que é processado como padrão para todos os nós filhos.
Conforme mencionado acima, durante o evento, o processamento é um filtro que é executado e durante a fase de bubbling do evento, um manipulador é executado. Todos os manipuladores e filtros implementam a interfaceEventHandler do pacote javafx.event.
Adicionando e Removendo Filtro de Eventos
Para adicionar um filtro de evento a um nó, você precisa registrar este filtro usando o método addEventFilter() do Node classe.
//Creating the mouse event handler
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
//Adding event Filter
Circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
Da mesma forma, você pode remover um filtro usando o método removeEventFilter () como mostrado abaixo -
circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
Exemplo de manipulação de eventos
A seguir está um exemplo que demonstra a manipulação de eventos em JavaFX usando os filtros de eventos. Salve este código em um arquivo com o nomeEventFiltersExample.java.
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class EventFiltersExample extends Application {
@Override
public void start(Stage stage) {
//Drawing a Circle
Circle circle = new Circle();
//Setting the position of the circle
circle.setCenterX(300.0f);
circle.setCenterY(135.0f);
//Setting the radius of the circle
circle.setRadius(25.0f);
//Setting the color of the circle
circle.setFill(Color.BROWN);
//Setting the stroke width of the circle
circle.setStrokeWidth(20);
//Setting the text
Text text = new Text("Click on the circle to change its color");
//Setting the font of the text
text.setFont(Font.font(null, FontWeight.BOLD, 15));
//Setting the color of the text
text.setFill(Color.CRIMSON);
//setting the position of the text
text.setX(150);
text.setY(50);
//Creating the mouse event handler
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
//Registering the event filter
circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
//Creating a Group object
Group root = new Group(circle, text);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting the fill color to the scene
scene.setFill(Color.LAVENDER);
//Setting title to the Stage
stage.setTitle("Event Filters Example");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
Compile e execute o arquivo java salvo no prompt de comando usando os comandos a seguir.
javac EventFiltersExample.java
java EventFiltersExample
Ao ser executado, o programa acima gera uma janela JavaFX conforme mostrado abaixo.
Adicionando e removendo manipuladores de eventos
Para adicionar um manipulador de eventos a um nó, você precisa registrar este manipulador usando o método addEventHandler() do Node classe como mostrado abaixo.
//Creating the mouse event handler
EventHandler<javafx.scene.input.MouseEvent> eventHandler =
new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
//Adding the event handler
circle.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandler);
Da mesma forma, você pode remover um manipulador de eventos usando o método removeEventHandler () conforme mostrado abaixo -
circle.removeEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);
Exemplo
O programa a seguir é um exemplo que demonstra a manipulação de eventos em JavaFX usando os manipuladores de eventos.
Salve este código em um arquivo com o nome EventHandlersExample.java.
import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;
public class EventHandlersExample extends Application {
@Override
public void start(Stage stage) {
//Drawing a Box
Box box = new Box();
//Setting the properties of the Box
box.setWidth(150.0);
box.setHeight(150.0);
box.setDepth(100.0);
//Setting the position of the box
box.setTranslateX(350);
box.setTranslateY(150);
box.setTranslateZ(50);
//Setting the text
Text text = new Text("Type any letter to rotate the box,
and click on the box to stop the rotation");
//Setting the font of the text
text.setFont(Font.font(null, FontWeight.BOLD, 15));
//Setting the color of the text
text.setFill(Color.CRIMSON);
//setting the position of the text
text.setX(20);
text.setY(50);
//Setting the material of the box
PhongMaterial material = new PhongMaterial();
material.setDiffuseColor(Color.DARKSLATEBLUE);
//Setting the diffuse color material to box
box.setMaterial(material);
//Setting the rotation animation to the box
RotateTransition rotateTransition = new RotateTransition();
//Setting the duration for the transition
rotateTransition.setDuration(Duration.millis(1000));
//Setting the node for the transition
rotateTransition.setNode(box);
//Setting the axis of the rotation
rotateTransition.setAxis(Rotate.Y_AXIS);
//Setting the angle of the rotation
rotateTransition.setByAngle(360);
//Setting the cycle count for the transition
rotateTransition.setCycleCount(50);
//Setting auto reverse value to false
rotateTransition.setAutoReverse(false);
//Creating a text filed
TextField textField = new TextField();
//Setting the position of the text field
textField.setLayoutX(50);
textField.setLayoutY(100);
//Handling the key typed event
EventHandler<KeyEvent> eventHandlerTextField = new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
//Playing the animation
rotateTransition.play();
}
};
//Adding an event handler to the text feld
textField.addEventHandler(KeyEvent.KEY_TYPED, eventHandlerTextField);
//Handling the mouse clicked event(on box)
EventHandler<javafx.scene.input.MouseEvent> eventHandlerBox =
new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent e) {
rotateTransition.stop();
}
};
//Adding the event handler to the box
box.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandlerBox);
//Creating a Group object
Group root = new Group(box, textField, text);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting camera
PerspectiveCamera camera = new PerspectiveCamera(false);
camera.setTranslateX(0);
camera.setTranslateY(0);
camera.setTranslateZ(0);
scene.setCamera(camera);
//Setting title to the Stage
stage.setTitle("Event Handlers Example");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
Compile e execute o arquivo java salvo no prompt de comando usando os comandos a seguir.
javac EventHandlersExample.java
java EventHandlersExample
Ao ser executado, o programa acima gera uma janela JavaFX exibindo um campo de texto e uma caixa 3D conforme mostrado abaixo -
Aqui, se você digitar uma letra no campo de texto, a caixa 3D começa a girar ao longo do eixo x. Se você clicar na caixa novamente, a rotação para.
Usando métodos de conveniência para manipulação de eventos
Algumas das classes em JavaFX definem propriedades do manipulador de eventos. Definindo os valores para essas propriedades usando seus respectivos métodos setter, você pode se registrar em um manipulador de eventos. Esses métodos são conhecidos como métodos de conveniência.
A maioria desses métodos existe em classes como Node, Scene, Window, etc. e estão disponíveis para todas as suas subclasses.
Por exemplo, para adicionar um ouvinte de evento de mouse a um botão, você pode usar o método de conveniência setOnMouseClicked() como mostrado abaixo.
playButton.setOnMouseClicked((new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Hello World");
pathTransition.play();
}
}));
Exemplo
O programa a seguir é um exemplo que demonstra o tratamento de eventos em JavaFX usando os métodos de conveniência.
Salve este código em um arquivo com o nome ConvinienceMethodsExample.java.
import javafx.animation.PathTransition;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.stage.Stage;
import javafx.util.Duration;
public class ConvinienceMethodsExample extends Application {
@Override
public void start(Stage stage) {
//Drawing a Circle
Circle circle = new Circle();
//Setting the position of the circle
circle.setCenterX(300.0f);
circle.setCenterY(135.0f);
//Setting the radius of the circle
circle.setRadius(25.0f);
//Setting the color of the circle
circle.setFill(Color.BROWN);
//Setting the stroke width of the circle
circle.setStrokeWidth(20);
//Creating a Path
Path path = new Path();
//Moving to the staring point
MoveTo moveTo = new MoveTo(208, 71);
//Creating 1st line
LineTo line1 = new LineTo(421, 161);
//Creating 2nd line
LineTo line2 = new LineTo(226,232);
//Creating 3rd line
LineTo line3 = new LineTo(332,52);
//Creating 4th line
LineTo line4 = new LineTo(369, 250);
//Creating 5th line
LineTo line5 = new LineTo(208, 71);
//Adding all the elements to the path
path.getElements().add(moveTo);
path.getElements().addAll(line1, line2, line3, line4, line5);
//Creating the path transition
PathTransition pathTransition = new PathTransition();
//Setting the duration of the transition
pathTransition.setDuration(Duration.millis(1000));
//Setting the node for the transition
pathTransition.setNode(circle);
//Setting the path for the transition
pathTransition.setPath(path);
//Setting the orientation of the path
pathTransition.setOrientation(
PathTransition.OrientationType.ORTHOGONAL_TO_TAN GENT);
//Setting the cycle count for the transition
pathTransition.setCycleCount(50);
//Setting auto reverse value to true
pathTransition.setAutoReverse(false);
//Creating play button
Button playButton = new Button("Play");
playButton.setLayoutX(300);
playButton.setLayoutY(250);
circle.setOnMouseClicked (new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
});
playButton.setOnMouseClicked((new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Hello World");
pathTransition.play();
}
}));
//Creating stop button
Button stopButton = new Button("stop");
stopButton.setLayoutX(250);
stopButton.setLayoutY(250);
stopButton.setOnMouseClicked((new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Hello World");
pathTransition.stop();
}
}));
//Creating a Group object
Group root = new Group(circle, playButton, stopButton);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
scene.setFill(Color.LAVENDER);
//Setting title to the Stage
stage.setTitle("Convenience Methods Example");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
Compile e execute o arquivo java salvo no prompt de comando usando os comandos a seguir.
javac ConvinienceMethodsExample.java
java ConvinienceMethodsExample
Ao ser executado, o programa acima gera uma janela JavaFX conforme mostrado abaixo. Clique aqui no botão play para iniciar a animação e clique no botão stop para parar a animação.