28 de jul de 2012

Tratamento de Evento Simples e o Botão

Vamos continuar falando de controles de interface e esse artigo será dedicado a somente um componente: o Botão. O motivo disso é que para falar de botão iremos falar de tratamento de evento, logo, precisaremos focar nisso, pois esse conhecimento é muito utilizado em qualquer aplicação.

Tratamento de evento

Tratar evento é determinar qual código será executado de acordo com uma ação do usuário. O usuário interage com sua aplicação através da interface, e dela ele faz diversas coisas: passa o cursor do mouse sobre um componente, arrasta coisas, clica, move o cursor para dentro ou para fora de um componente, entre outros. Qualquer componente é passível de sobre ações desse tipo por parte do usuário, logo, na classe Node podemos tratar qualquer um desses eventos. No post de hoje, no entanto, não iremos falar de todos eles, mas só de um que é o evento de ação. Quando o usuário clica em um botão, ele dispara esse evento, hoje iremos apresentar o botão, fazer um programa simples com ele e explicar como tratar o clique em um botão. Futuramente iremos falar mais sobre como tratar cada um desses outros eventos quando entrarmos em detalhes na classe Node.

Botões e Ouvintes

Botões estão em todos os lugares, com certeza você deve ter clicado em algum botão hoje :). No JavaFX, um botão pode ser usado através da classe Button. No entanto, simplesmente adicionar um botão na cena não ajuda em muita coisa, você deve informar para ele o que deve ser feito assim que um usuário clicar no mesmo. Isso é feito através de ouvintes de evento, que são classes que implementam uma determinada interface.
No caso de botão, temos o atributo onAction que é do tipo da interface EventHandler. Essa interface exige que você implemente o método handle, pois é esse método que será chamado quando você clicar no botão. Em resumo, você deve criar uma classe que implementa essa interface e informar ao botão uma instância dessa classe para que o botão chame o método quando o usuário do seu programa clicar nele! Indo um pouco mais a fundo, note que também essa interface usa genéricos para determinar o tipo de atributo que o método deverá receber, no nosso caso, o botão chama o método e envia um instância de ActionEvent, classe que contém diversas informações sobre o evento ocorrido.
Nossa, muita informação! Mas isso ficará melhor nas próximas linhas, pois mostremos exemplos de código e tudo ficará mais claro.

Clique em mim!

Vamos começar mostrando um exemplo do clássico clique em mim para assim demonstrar o tratamento mais simples possível de evento. A nossa classe ouvinte, ou tratadora de evento se encontra abaixo e em seguida uma breve explicação do código.
import javafx.event.ActionEvent;
import javafx.event.EventHandler;

public class TratadorEvento implements EventHandler { // 1


 @Override
 public void handle(ActionEvent evento) { // 2
  System.out.println("Evento tratado por uma classe externa");
 }

}

  1. Conforme já falamos, a classe destinada a tratar eventos deve implementar a Interface EventHandler. Nesse caso também fica claro o uso de Genéricos, onde devemos informar um tipo de classe que herda de Event, no caso informamos o ActionEvent, pois é o que o botão requer;
  2. Esse é o método que será chamado quando clicarmos no botão.O parâmetro evento será enviado pelo gerador do evento, no caso o botão, e deles poderíamos saber tudo de quem gerou o evento.
Mas de quem esse tratador de evento trata eventos? O próximo passo é informar para um botão qual será o seu tratador de evento. Veja abaixo que uso duas linhas para isso e basicamente criamos um botão e informamos quem será o tratador de evento através do método setOnAction.

Ótimo, já sabemos tratar eventos, mas e se você não quiser criar uma classe para toda vez que quiser tratar um clique? Você pode utilizar um classe anônima. Outra possibilidade é usa a própria classe atual para ser quem irá tomar alguma ação ao clique do usuário.
Para ilustrar tudo isso, criamos uma simples aplicação com três botões e as três formas de se registar um tratador de evento. O código abaixo mostra essa aplicação e também explica diretamente no comentário!

package main;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

//Se quisermos que essa classe trate evento, ela deve herdar de EventHandler
public class Principal extends Application implements EventHandler {

 public static void main(String[] args) {
  launch();
 }

 @Override
 public void start(Stage palco) throws Exception {
  VBox raiz = new VBox(20);
  raiz.setAlignment(Pos.CENTER);
  raiz.setTranslateY(5);

  Button botao1 = new Button("Clique em mim! (Tratador externo)");
  Button botao2 = new Button("Clique em mim! (Class Anônima)");
  Button botao3 = new Button("Clique em mim! (Própria classe)");

  // usamos a classe TratadorEvento para cuidar dos eventos
  botao1.setOnAction(new TratadorEvento());
  // Criando uma instância de uma classe anônima para tratar evento
  botao2.setOnAction(new EventHandler() {

   @Override
   public void handle(ActionEvent evento) {
    System.out.println("Evento tratado por uma classe anônima!");
   }
  });
  // o botão 3 usa essa própria classe para tratar seus eventos
  botao3.setOnAction(this);

  raiz.getChildren().addAll(botao1, botao2, botao3);

  Scene cena = new Scene(raiz, 300, 200);
  palco.setTitle("Tratando eventos");
  palco.setScene(cena);
  palco.show();

 }

 @Override
 public void handle(ActionEvent evento) {
  System.out.println("Evento tratado na próxima classe!");
 }
}


A aplicação final bem como o que será impresso no console é mostrado na imagem abaixo

Conclusão

Mostramos como tratar eventos de um botão com JavaFX. Esse post foi meio parado e chato, mas isso foi necessário. Em breve mostraremos outros elementos de interface e iremos querer dar mais vida aos nossos programas. Isso só pode ser feito tratando eventos :). Como sempre, segue abaixo o projeto do Eclipe caso você queira baixar e explorar mais.

6 comentários:

  1. seu material sobre o javafx, esta ficando mto bom; sinta-se livre para postar na nossa comunidade java aberto do facebook

    ResponderExcluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Este comentário foi removido pelo autor.

    ResponderExcluir
  4. boa tarde, não estou conseguindo colocar o player pra rodar, criei uma janela com um botão para audio e outra para o vídeo a do audio funciona normalmente, mas a do video não. segue sempre a mensagem de erro:
    um RuntimeException causada por:

    Caused by: MediaException: MEDIA_UNSUPPORTED : Unrecognized file signature!
    como posso corrigir isso?
    o mesmo acontece com o pacote disponibilizado pelo blog.

    ResponderExcluir
  5. Bom dia. Gostaria de algumas dicas de como criar telas em javaFx, e como fazer para passar de uma tela para outra. Obrigado.

    ResponderExcluir