Diálogos e modais
Diálogos são janelas popup empilhadas sobre a tela atual. No CrossFly os três principais são
Alert (confirmação), ActionSheet (lista de ações) e Hint (aviso efêmero, o antigo “Toast”).
⚠️ Alert/ActionSheet respondem pelos BOTÕES, não por onAnswer
Eles estendem Window (não Picker), então show(callback) não retorna valor. A escolha do
usuário chega pelo callback do botão (buttonAction). (Ver Retornar valores.)
Exemplo completo (copiar, colar e rodar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*;
/** 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());
// Alert — botões no construtor (0 = Cancelar, 1 = Excluir); ação por índice.
Button excluir = new Button("Excluir item");
excluir.onAction(c -> {
Alert a = new Alert("Excluir", "Confirma a exclusão deste item?", "Cancelar", "Excluir");
a.buttonAction(1, x -> Hint.show("Item excluído", 2000)); // Cancelar (0) só fecha
// popup: dimensiona e escurece o fundo via WindowStyle fluente
a.getStyle().widthRatio(0.85f).fadeBackground(128).transition(UIConstants.Transition.FADE);
a.show();
});
add(LAY_AUTO, excluir);
// ActionSheet — 1º argumento é o texto de cancelar.
Button compartilhar = new Button("Compartilhar");
compartilhar.onAction(c -> {
ActionSheet sheet = new ActionSheet("Cancelar", "E-mail", "Mensagem");
sheet.buttonAction(0, x -> Hint.show("Enviado por e-mail", 2000)); // índice 0 = E-mail
sheet.buttonAction(1, x -> Hint.show("Enviado por SMS", 2000)); // índice 1 = Mensagem
sheet.show();
});
add(LAY_AUTO, compartilhar);
// Hint — aviso efêmero (delay em ms).
Button avisar = new Button("Mostrar aviso");
avisar.onAction(c -> Hint.show("Salvo com sucesso", 2000));
add(LAY_AUTO, avisar);
}
}
Os trechos abaixo mostram só o miolo (o que vai dentro de
onShow()). Para rodar, coloque-os no esqueletoMainWindowacima.
Alert (confirmar / avisar)
Os textos dos botões vão no construtor; a ação de cada um é ligada por índice com buttonAction:
// botões: índice 0 = "Cancelar", índice 1 = "Excluir"
Alert a = new Alert("Excluir", "Confirma a exclusão deste item?", "Cancelar", "Excluir");
a.buttonAction(1, c -> excluirItem()); // ação vem daqui, NÃO de show(cb); Cancelar só fecha
a.show();
ActionSheet (escolher uma ação)
Também recebe os textos no construtor (o primeiro argumento é o texto de cancelar):
ActionSheet sheet = new ActionSheet("Cancelar", "E-mail", "Mensagem");
sheet.buttonAction(0, c -> enviarPorEmail()); // índice 0 = "E-mail"
sheet.buttonAction(1, c -> enviarPorSMS()); // índice 1 = "Mensagem"
sheet.cancelAction(c -> {}); // opcional: ação ao cancelar
sheet.show();
Hint (aviso efêmero — substitui Toast/ToolTip)
Hint.show("Salvo com sucesso", 2000); // some sozinho
Configurar aparência do popup — WindowStyle
Um popup é dimensionado/posicionado pelo WindowStyle da janela. Campos úteis:
| Campo | Efeito |
|---|---|
widthRatio / heightRatio |
tamanho como fração da tela |
yRatio / xAbs / yAbs |
posição |
fadeBackground |
escurece o fundo atrás do popup |
canHide |
tocar fora fecha o popup |
canMove |
usuário pode arrastar |
transition / transitionDuration |
animação de entrada/saída (padrão NONE, 0.5s) |
getStyle().widthRatio = 0.85f; // 85% da largura
getStyle().fadeBackground = true; // fundo escurecido
getStyle().transition = UIConstants.Transition.FADE; // aparece com fade
Boas práticas
- Rótulos de botão claros (“Excluir” em vez de “OK”); ação destrutiva por último.
- Prefira
HintaAlertpara confirmações não bloqueantes.
Erros comuns
alert.show(cb)esperando ocbdisparar — não dispara; ligue a ação combuttonAction(i, callback).- Chamar
addButton(...)/addOption(...)— não existem; os textos vão no construtor e as ações por índice. - Empilhar vários popups sobre o mesmo evento.
Veja também
- Retornar valores · A pilha de janelas
- Catálogo: Alert · ActionSheet · Hint
Esta página foi útil?Obrigado pelo feedback!