# Cómo pedir confirmación antes de una acción destructiva

> Mostrar un Alert de confirmación con buttonAction, oscurecer el fondo y dar feedback con Hint.

Source: https://crossfly.dev/es/docs/cookbook/nav/dialogo-confirmacao — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Cómo pedir confirmación antes de una acción destructiva

**Propósito.** Antes de eliminar/descartar algo, muestra un `Alert` con dos botones (ej.: "Cancelar" y "Eliminar"). Ejecuta la acción destructiva solo en el callback del botón de confirmación.

## APIs usadas
- `new Alert(String title, String message, String... buttonTexts)` — crea el diálogo. `Alert` **es una `Window`**; los botones siguen el `Skin` activo.
- `Alert.buttonAction(int index, Component.Action action)` — define la acción de un botón (índice 0-based). Sin acción, el botón solo cierra (`hide()`).
- `Alert.show()` — apila el diálogo (push modal).
- `WindowStyle.fadeBackground(int alpha)` — oscurece las ventanas de abajo (0–255). Obtén el style mediante `getStyle()`.
- `Hint.show(String message, int delayMs)` — muestra un toast breve de feedback.

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

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

/** Pantalla principal ejecutable: un botón dispara el Alert de confirmación. */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(new Label("Pedido #1234"));
      add(new Button("Excluir pedido").onAction(e -> confirmarExclusao()));
   }

   private void confirmarExclusao()
   {
      Alert alert = new Alert("Excluir pedido", "Esta ação não pode ser desfeita.", "Cancelar", "Excluir");

      // Oscurece el fondo (0..255). getStyle() del Alert es un WindowStyle.
      ((WindowStyle) alert.getStyle()).fadeBackground(150);

      // Índice 0 = "Cancelar": sin buttonAction, el botón ya cierra el Alert por sí solo.
      // Índice 1 = "Excluir": acción destructiva + feedback.
      alert.buttonAction(1, e ->
      {
         excluirPedido();                 // acción destructiva
         alert.hide();                    // cierra el diálogo
         Hint.show("Pedido excluído", 1500);
      });

      alert.show();
   }

   private void excluirPedido()
   {
      // ... 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
// verificado en la fuente: Alert.buttonAction(idx, Action); WindowStyle.fadeBackground(int 0-255); Hint.show(msg, ms)
Alert alert = new Alert("Excluir pedido", "Esta ação não pode ser desfeita.", "Cancelar", "Excluir");

// Oscurece el fondo (0..255). getStyle() del Alert es un WindowStyle.
((WindowStyle) alert.getStyle()).fadeBackground(150);

// Índice 0 = "Cancelar": sin buttonAction, el botón ya cierra el Alert por sí solo.
// Índice 1 = "Excluir": acción destructiva + feedback.
alert.buttonAction(1, e ->
{
   excluirPedido();                 // acción destructiva
   alert.hide();                    // cierra el diálogo
   Hint.show("Pedido excluído", 1500);
});

alert.show();
```

Detalles que evitan sorpresas:

- Si **no** defines `buttonAction` para un botón, el Alert le asocia `onAction(e -> hide())` — el botón cierra el diálogo sin hacer nada más. Por eso "Cancelar" normalmente prescinde de `buttonAction`.
- Coloca la acción destructiva **siempre** en el botón de confirmación (aquí, índice 1), nunca como comportamiento por defecto.
- `fadeBackground` recibe alpha 0–255 (no 0xAARRGGBB). 150 da un oscurecimiento perceptible sin apagar el contenido.

## Profundiza
- [Diálogos y modales](/docs/ui/navigation/dialogs-and-modals)
- Receta hermana: [Abrir y cerrar una pantalla](/docs/cookbook/nav/abrir-tela)
