17 de mar. de 2015

As janelas de dialogs do JavaFX

Uma das maiores necessidades do JavaFX foi a adição de uma biblioteca consistente para termos acesso a diálogos. Aquelas janelinhas que aparecem em uma aplicação para entrarmos alguma informação. Nessa postagem vamos falar das classes que permitem a criação de diálogos, mas que foram adicionadas recentemente. Muitos da era Swing devem se lembrar do JOptionPane.

Os diálogos do JavaFX 


Essa parte do JavaFX começam no Java 8 atualização 40. Ficam no pacote javax.scene.control e usando a classe Alert podemos criar diálogos de erro, avisos, confirmação, com mensagem de erro (stacktrace) e você ainda pode customizar e criar o seu próprio diálogo com botões que irão ter ações customizadas.

Exibindo mensagens de erro, aviso e informação


O mais simples dos diálogos permitem que você simplesmente mostra uma imagem em uma caixinha de texto. Esses diálogos aceitam a configuração de um título, um cabeçalho e a mensagem de aviso em sí. Os diálogos de informação e error são semelhantes, só temos que trocar o tipo de Alert para Error, Warning ou Information. O programa abaixo mostra como podemos usar ambos:

package org.jugvale;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
*
* @author william
*/
public class Post24DialogosMensagens extends Application {
@Override
public void start(Stage stage) {
Button btnInfo = new Button("Mostrar diálogo de informação");
Button btnErro = new Button("Mostrar diálogo de error");
Button btnAviso = new Button("Mostrar diálogo de aviso");
btnInfo.setOnAction(e -> {
Alert dialogoInfo = new Alert(Alert.AlertType.INFORMATION);
dialogoInfo.setTitle("Diálogo de informação");
dialogoInfo.setHeaderText("Esse é o cabeçalho...");
dialogoInfo.setContentText("Informação importante!");
dialogoInfo.showAndWait();
});
btnErro.setOnAction(e -> {
Alert dialogoErro = new Alert(Alert.AlertType.ERROR);
dialogoErro.setTitle("Diálogo de Error");
dialogoErro.setHeaderText("Esse é o cabeçalho...");
dialogoErro.setContentText("UM ERROR!!! UM ERRO ACONTECEU!!! GEZUIS!");
dialogoErro.showAndWait();
});
btnAviso.setOnAction(e -> {
Alert dialogoAviso = new Alert(Alert.AlertType.WARNING);
dialogoAviso.setTitle("Diálogo de Aviso");
dialogoAviso.setHeaderText("Esse é o cabeçalho...");
dialogoAviso.setContentText("AVISO IMPORTANTE! TENHA EM MENTE ISSO!");
dialogoAviso.showAndWait();
});
VBox raiz = new VBox(20);
raiz.setAlignment(Pos.CENTER);
raiz.getChildren().addAll(btnInfo, btnErro, btnAviso);
Scene cena = new Scene(raiz, 450, 200);
stage.setTitle("Diálogos de erro e informação");
stage.setScene(cena);
stage.show();
}
}


Percebam que as classes bases para criarmos diálogos são javafx.scene.control.Alert e javafx.scene.control.Alert.AlertType.  Vejam o resultado de cada diálogo quando clicamos neles na aplicação acima:







Pegando entradas dos usuários


Um uso mais avançado dos diálogos são para pegarmos uma resposta do usuário. Podemos colocar neles perguntas para pegar a resposta do usuário, campos de texto e caixas de escolha. Veja abaixo um programa que mostra o uso mais simples de cada um deles:


package org.jugvale;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ChoiceDialog;
import javafx.scene.control.Label;
import javafx.scene.control.TextInputDialog;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
/**
*
* @author william
*/
public class Post24DialogosEntradas extends Application {
String nome, regiao, fazExe;
@Override
public void start(Stage stage) {
Label lblTitulo = new Label("Questionário Importante");
Button btnNome = new Button("Entrar com Nome");
Button btnRegiao = new Button("Região que mora");
Button btnExe = new Button("Faz exercício?");
Button btnRes = new Button("Ver Resultado");
lblTitulo.setFont(Font.font(24));
btnNome.setOnAction(e -> {
TextInputDialog dialogoNome = new TextInputDialog();
dialogoNome.setTitle("Entrada de nome");
dialogoNome.setHeaderText("Entre com seu nome");
dialogoNome.setContentText("Nome:");
// se o usuário fornecer um valor, assignamos ao nome
dialogoNome.showAndWait().ifPresent(v -> nome = v);
});
btnRegiao.setOnAction(e -> {
// o primeiro parâmetro é a escola padrão e os outros são os valores da Choice Box
ChoiceDialog dialogoRegiao = new ChoiceDialog("Sul", "Sul", "Leste", "Oeste", "Norte");
dialogoRegiao.setTitle("Entrada de Região");
dialogoRegiao.setHeaderText("Informe sua região abaixo");
dialogoRegiao.setContentText("Região:");
dialogoRegiao.showAndWait().ifPresent(r -> regiao = r.toString());
});
btnExe.setOnAction(e -> {
Alert dialogoExe = new Alert(Alert.AlertType.CONFIRMATION);
ButtonType btnSim = new ButtonType("Sim");
ButtonType btnNao = new ButtonType("Não");
ButtonType btnAsVezes = new ButtonType("As vezes");
ButtonType btnNaoResponder = new ButtonType("Cancelar", ButtonBar.ButtonData.CANCEL_CLOSE);
dialogoExe.setTitle("Pergunta sobre exercício");
dialogoExe.setHeaderText("Informe se você faz exercício");
dialogoExe.setContentText("Você faz exercício?");
dialogoExe.getButtonTypes().setAll(btnSim, btnNao, btnAsVezes, btnNaoResponder);
dialogoExe.showAndWait().ifPresent(b -> {
if (b == btnSim) {
fazExe = "faz exercício";
} else if (b == btnNao) {
fazExe = "não faz exercício";
} else if (b == btnAsVezes) {
fazExe = "faz exercício as vezes";
} else {
fazExe = "não quis responder";
}
});
});
btnRes.setOnAction(e -> {
Alert dialogoResultado = new Alert(Alert.AlertType.INFORMATION);
dialogoResultado.setHeaderText("Resultado do questionário");
dialogoResultado.setContentText(nome + " mora na região " + regiao + " e " + fazExe + ".");
dialogoResultado.showAndWait();
});
VBox raiz = new VBox(20);
raiz.setAlignment(Pos.CENTER);
raiz.getChildren().addAll(lblTitulo, btnNome, btnRegiao, btnExe, btnRes);
Scene cena = new Scene(raiz, 450, 250);
stage.setTitle("Diálogos para entradas dos usuários");
stage.setScene(cena);
stage.show();
}
}


O resultado é mostrado abaixo:







Outros tipos



Essa API demorou para sair, mas quando veio, veio completa! Podemos criar tipos customizados de diálogos de acordo com as necessidades do usuário. Cabe ao leitor explorar as mais diversas alternativas, mas um bom resumão pode ser encontrado nessa postagem em inglês.

8 comentários:

  1. Tentei rodar aqui mas deu erro na importação de pacotes.
    Tive que alterar as linhas 6 e 7 para:

    import javafx.scene.control.Alert;
    import javafx.scene.control.Button;

    ResponderExcluir
  2. como faz pra validar os dados do textfield no dialog??

    ResponderExcluir
  3. Primeiro, parabéns pelo post!
    Infelizmente o seu código não executou na minha máquina. Não reconhece a AlertType.
    gostaria de saber onde se encontra a classe alertType?

    ResponderExcluir