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:
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:
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:
O resultado é mostrado abaixo:
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
Show William, parabéns pelo Post!
ResponderExcluirMt bom o post, obg William
ResponderExcluirTentei rodar aqui mas deu erro na importação de pacotes.
ResponderExcluirTive que alterar as linhas 6 e 7 para:
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
como faz pra validar os dados do textfield no dialog??
ResponderExcluirPrimeiro, parabéns pelo post!
ResponderExcluirInfelizmente 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?
parabens muito bom
ResponderExcluirparabéns aprendi comes te código ..
ResponderExcluirMUITO BOM
ResponderExcluir