Alert
Alert é a caixa de diálogo modal do CrossFly — o equivalente a um MessageBox/AlertDialog. Mostra um título, uma mensagem (com word-wrap automático) e um ou mais botões de ação dispostos em linhas. Cada botão pode ter um callback próprio; sem callback, o botão apenas fecha o diálogo. O visual (cores, fontes, layout dos botões) vem do Skin ativo.
🟢 · Pacote:
dev.crossfly.ui· Estende:Window· Estilo:AlertStyle+WindowStyle
Quando usar
- Confirmações que exigem reconhecimento do usuário (excluir? salvar? descartar?).
- Escolhas simples sim/não ou uma mensagem que precisa de um “OK”.
Quando NÃO usar
- Feedback passivo e efêmero (sucesso/erro/status) → use
Hint. - Lista de ações contextuais sobre um item (compartilhar/editar/excluir) → use
ActionSheet.
Aparência
Cartão centralizado com título no topo, mensagem no meio e uma linha de botões na base. Por padrão o fundo não é escurecido — ajuste WindowStyle.fadeBackground para o efeito modal clássico.
Exemplo completo (copiar, colar e rodar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Button abrir = new Button("Abrir alerta");
abrir.onAction(c ->
{
Alert a = new Alert("Excluir item",
"Tem certeza que deseja excluir este item? Esta ação não pode ser desfeita.",
"Excluir", "Cancelar");
// Fundo escurecido para reforçar a modalidade (alpha 0..255)
WindowStyle ws = a.getStyle();
ws.fadeBackground(150);
// Botão 0 = Excluir -> executa, fecha e dá feedback
a.buttonAction(0, origin ->
{
a.hide();
Hint.show("Item excluído", 2000);
});
// Botão 1 = Cancelar: sem callback -> default já chama hide()
a.show();
});
add(LAY_AUTO, abrir);
}
}
Os trechos abaixo mostram só o miolo (o que vai dentro de
onShow()). Para rodar, coloque-os no esqueletoMainWindowacima.
Uso básico
// buttonTexts é varargs opcional — se vazio/null, vira {"OK"}
Alert a = new Alert("Aviso", "Operação concluída com sucesso.", "OK");
a.show();
Construtores
| Construtor | Descrição |
|---|---|
Alert(String title, String message, String... buttonTexts) |
title pode ser "" (oculta visualmente o título). buttonTexts opcional; vazio/null → {"OK"}. |
⚠️ Não existe
Alert.show(...)estático nem construtor que dispare callback. Sempre instancie comnew Alert(...), registre os callbacks por botão e chameshow().
Propriedades e personalização
| Propriedade / método | Tipo | Padrão | O que faz |
|---|---|---|---|
style() |
AlertStyle |
skin | Retorna o AlertStyle atual. |
style(AlertStyle) |
fluente | — | Define um AlertStyle customizado. |
style().buttonLayout(...) |
IOS/FLUTTER/MATERIAL |
MATERIAL |
Estilo de disposição dos botões. |
style().maxButtonsPerRow(int) |
int |
skin | Botões por linha; excedentes quebram em novas linhas. |
skin(Skin) |
fluente | — | Troca o skin e reatualiza o AlertStyle. |
getButton(int index) |
Button |
— | Botão após show() (antes disso, null). |
getAutoWidth() / getAutoHeight() |
int |
— | Dimensões calculadas. |
Callbacks e eventos
| Callback | Quando dispara |
|---|---|
buttonAction(int index, Component.Action action) |
ao tocar o botão de índice index (0-based). |
⚠️ A resposta NÃO vem por
show(onAnswer).AlertestendeWindow, nãoPicker— eWindow.hide()só entregaonAnswerquandothis instanceof Picker. Logo, para reagir a cada botão usebuttonAction(index, action). Não hágetAnswer()noAlert.
O tipo do callback é Component.Action, cujo método é void run(Component origin) — o corpo do lambda não retorna valor (nada de return null;).
Estados
- Botão sem callback registrado → recebe a ação default
hide()(fecha o diálogo). - Botão com callback → executa o callback; se o callback não fechar, o diálogo continua aberto (chame
a.hide()você mesmo). - Gesto “voltar”/back → respeitado se
WindowStyle.canHide(defaulttrue).
Confirmação com fundo escurecido
Alert confirm = new Alert("Excluir item",
"Tem certeza que deseja excluir este item? Esta ação não pode ser desfeita.",
"Excluir", "Cancelar");
// Reforça a modalidade escurecendo o fundo (alpha 0..255)
WindowStyle ws = confirm.getStyle();
ws.fadeBackground(150);
// Botão 0 = Excluir -> executa, fecha e dá feedback
confirm.buttonAction(0, origin ->
{
excluirItem();
confirm.hide();
Hint.show("Item excluído", 2000);
});
// Botão 1 = Cancelar: sem callback -> default já chama hide()
confirm.show();
Escolher o layout dos botões
Alert a = new Alert("Salvar", "Deseja salvar as alterações?", "Salvar", "Descartar");
a.style().buttonLayout(AlertStyle.ButtonLayout.IOS) // IOS / FLUTTER / MATERIAL
.maxButtonsPerRow(2);
a.show();
Boas práticas
- Use para decisões que exigem reconhecimento. Para feedback passivo, prefira
Hint. - Mantenha poucos botões — muitos quebram em linhas e deixam o diálogo alto.
- Combine com
fadeBackgroundsempre que quiser o efeito modal clássico.
Erros comuns
- Esperar resposta via
show(onAnswer)— isso é exclusivo dePicker. RegistrebuttonAction(...). - Acessar
getButton(i)antes deshow()— os botões são criados emonAdde retornamnullantes disso. - Fazer o lambda de
buttonActionretornar valor —Action.run(...)évoid.
Veja também
- Guia da área:
ui/· Receitas:cookbook/ - Componentes relacionados:
ActionSheet·Hint