# Como pedir confirmação com Alert

> Abrir um diálogo modal de confirmação com botões Cancelar/OK e reagir à escolha.

Source: https://crossfly.dev/pt/docs/cookbook/ui/confirmar-com-alert — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Como pedir confirmação com Alert

**Propósito.** Exibir um diálogo modal com título, mensagem e um ou mais botões, e
executar uma ação conforme o botão pressionado. Use para confirmações destrutivas
("Excluir?"), avisos que exigem ciência do usuário, ou escolhas simples.

## APIs usadas
- `new Alert(String title, String message, String... buttonTexts)` — cria o alerta. Os textos dos botões são passados **no construtor** (índice 0, 1, 2...). Se nenhum for informado, usa `"OK"`.
- `alert.buttonAction(int index, Component.Action action)` — registra o callback do botão daquele índice. **Não existe `addButton`**; os botões já foram declarados no construtor.
- `alert.show()` — exibe o diálogo (herdado de `Window`).
- `alert.getStyle().fadeBackground(int alpha)` — escurece o fundo atrás do alerta (0–255). `getStyle()` retorna a `WindowStyle` do alerta.
- `alert.getButton(int index)` — retorna o `Button` daquele índice (disponível após `show()`).

> Comportamento não óbvio: se você **não** registrar `buttonAction` para um botão,
> ele apenas fecha o alerta (`hide()`) ao ser tocado. Então, para "Cancelar", muitas
> vezes você nem precisa de callback.

## Exemplo completo (copiar, colar e rodar)
```java
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());

      // Botão-gatilho: abre o Alert ao ser tocado
      Button btn = new Button("Excluir registro");
      btn.onAction(origin ->
      {
         Alert alert = new Alert(
            "Excluir registro",
            "Esta ação não pode ser desfeita. Deseja continuar?",
            "Cancelar",   // índice 0
            "Excluir");   // índice 1

         // Escurece o fundo (opcional, mas recomendado para modais destrutivos)
         alert.getStyle().fadeBackground(150);

         // Botão 0 (Cancelar) sem callback → só fecha.
         // Botão 1 (Excluir) executa a ação e fecha:
         alert.buttonAction(1, o ->
         {
            excluirRegistro();
            alert.hide();
         });

         alert.show();
      });
      add(LAY_FILL, btn);
   }

   private void excluirRegistro()
   {
      // ... sua lógica de exclusão ...
   }
}
```

> O trecho abaixo mostra **só o miolo**. Para rodar, coloque-o no esqueleto `MainWindow` acima.

## Trecho mínimo
```java
Alert alert = new Alert(
   "Excluir registro",
   "Esta ação não pode ser desfeita. Deseja continuar?",
   "Cancelar",   // índice 0
   "Excluir");   // índice 1

// Escurece o fundo (opcional, mas recomendado para modais destrutivos)
alert.getStyle().fadeBackground(150);

// Botão 0 (Cancelar) sem callback → só fecha.
// Botão 1 (Excluir) executa a ação e fecha:
alert.buttonAction(1, origin ->
{
   excluirRegistro();
   alert.hide();
});

alert.show();
```

> **Nota de verificação (código 2026).** Confirmado na fonte: construtor
> `Alert(title, message, String... buttonTexts)` + `buttonAction(int, Action)`.
> O layout dos botões (iOS/Material/Flutter) é decidido pela `AlertStyle` do `Skin`
> ativo — troque o `Skin` (ou use `alert.skin(new IOSSkin())`) para mudar o visual
> sem alterar o código de lógica. A largura/altura do alerta é auto-calculada a partir
> do título, mensagem e botões.

## Aprofunde-se
- Página do widget: [Alert](/docs/ui/widgets/alert) · Fonte canônica: Capítulo 16
- Receitas irmãs: [Menu de ações (ActionSheet)](/docs/cookbook/ui/menu-de-acoes) · [Mostrar um Hint](/docs/cookbook/ui/mostrar-um-hint)
