# Cómo pedir confirmación con Alert

> Abrir un diálogo modal de confirmación con botones Cancelar/OK y reaccionar a la elección.

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

# Cómo pedir confirmación con Alert

**Propósito.** Mostrar un diálogo modal con título, mensaje y uno o más botones, y
ejecutar una acción según el botón presionado. Úsalo para confirmaciones destructivas
("¿Eliminar?"), avisos que requieren que el usuario tome conocimiento, o elecciones simples.

## APIs usadas
- `new Alert(String title, String message, String... buttonTexts)` — crea la alerta. Los textos de los botones se pasan **en el constructor** (índice 0, 1, 2...). Si no se informa ninguno, usa `"OK"`.
- `alert.buttonAction(int index, Component.Action action)` — registra el callback del botón de ese índice. **No existe `addButton`**; los botones ya se declararon en el constructor.
- `alert.show()` — muestra el diálogo (heredado de `Window`).
- `alert.getStyle().fadeBackground(int alpha)` — oscurece el fondo detrás de la alerta (0–255). `getStyle()` devuelve la `WindowStyle` de la alerta.
- `alert.getButton(int index)` — devuelve el `Button` de ese índice (disponible tras `show()`).

> Comportamiento no obvio: si **no** registras `buttonAction` para un botón,
> este solo cierra la alerta (`hide()`) al ser tocado. Entonces, para "Cancelar", muchas
> veces ni siquiera necesitas un callback.

## Ejemplo completo (copiar, pegar y ejecutar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // Botón disparador: abre el Alert al 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

         // Oscurece el fondo (opcional, pero recomendado para modales destructivos)
         alert.getStyle().fadeBackground(150);

         // Botón 0 (Cancelar) sin callback → solo cierra.
         // Botón 1 (Excluir) ejecuta la acción y cierra:
         alert.buttonAction(1, o ->
         {
            excluirRegistro();
            alert.hide();
         });

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

   private void excluirRegistro()
   {
      // ... tu lógica de eliminación ...
   }
}
```

> El fragmento de abajo muestra **solo el núcleo**. Para ejecutarlo, colócalo en el esqueleto `MainWindow` de arriba.

## Fragmento 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

// Oscurece el fondo (opcional, pero recomendado para modales destructivos)
alert.getStyle().fadeBackground(150);

// Botón 0 (Cancelar) sin callback → solo cierra.
// Botón 1 (Excluir) ejecuta la acción y cierra:
alert.buttonAction(1, origin ->
{
   excluirRegistro();
   alert.hide();
});

alert.show();
```

> **Nota de verificación (código 2026).** Confirmado en la fuente: constructor
> `Alert(title, message, String... buttonTexts)` + `buttonAction(int, Action)`.
> El layout de los botones (iOS/Material/Flutter) lo decide la `AlertStyle` del `Skin`
> activo — cambia el `Skin` (o usa `alert.skin(new IOSSkin())`) para modificar el aspecto
> sin alterar el código de la lógica. El ancho/alto de la alerta se calcula automáticamente a partir
> del título, el mensaje y los botones.

## Profundiza
- Página del widget: [Alert](/docs/ui/widgets/alert) · Fuente canónica: Capítulo 16
- Recetas hermanas: [Menú de acciones (ActionSheet)](/docs/cookbook/ui/menu-de-acoes) · [Mostrar un Hint](/docs/cookbook/ui/mostrar-um-hint)
