Pular para o conteúdo
CrossFly é 100% open sourceSiga no GitHub
CrossFlyCrossFly
Começar

Como pedir confirmação antes de uma ação destrutiva

Propósito. Antes de excluir/descartar algo, mostre um Alert com dois botões (ex.: “Cancelar” e “Excluir”). Só execute a ação destrutiva no callback do botão de confirmação.

APIs usadas

  • new Alert(String title, String message, String... buttonTexts) — cria o diálogo. Alert é uma Window; os botões seguem o Skin ativo.
  • Alert.buttonAction(int index, Component.Action action) — define a ação de um botão (índice 0-based). Sem ação, o botão apenas fecha (hide()).
  • Alert.show() — empilha o diálogo (push modal).
  • WindowStyle.fadeBackground(int alpha) — escurece as janelas abaixo (0–255). Obtenha o style via getStyle().
  • Hint.show(String message, int delayMs) — mostra um toast breve de feedback.

Exemplo completo (copiar, colar e rodar)

package com.exemplo;

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

/** Tela principal executável: um botão dispara o Alert de confirmação. */
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");

      // Escurece o fundo (0..255). getStyle() do Alert é um WindowStyle.
      ((WindowStyle) alert.getStyle()).fadeBackground(150);

      // Índice 0 = "Cancelar": sem buttonAction, o botão já fecha o Alert sozinho.
      // Índice 1 = "Excluir": ação destrutiva + feedback.
      alert.buttonAction(1, e ->
      {
         excluirPedido();                 // ação destrutiva
         alert.hide();                    // fecha o diálogo
         Hint.show("Pedido excluído", 1500);
      });

      alert.show();
   }

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

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

Trecho mínimo

// verificado na fonte: 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");

// Escurece o fundo (0..255). getStyle() do Alert é um WindowStyle.
((WindowStyle) alert.getStyle()).fadeBackground(150);

// Índice 0 = "Cancelar": sem buttonAction, o botão já fecha o Alert sozinho.
// Índice 1 = "Excluir": ação destrutiva + feedback.
alert.buttonAction(1, e ->
{
   excluirPedido();                 // ação destrutiva
   alert.hide();                    // fecha o diálogo
   Hint.show("Pedido excluído", 1500);
});

alert.show();

Detalhes que evitam surpresa:

  • Se você não definir buttonAction para um botão, o Alert associa onAction(e -> hide()) — o botão fecha o diálogo sem mais nada. Por isso “Cancelar” normalmente dispensa buttonAction.
  • Coloque a ação destrutiva sempre no botão de confirmação (aqui, índice 1), nunca como comportamento padrão.
  • fadeBackground recebe alpha 0–255 (não 0xAARRGGBB). 150 dá um escurecimento perceptível sem apagar o conteúdo.

Aprofunde-se

Esta página foi útil?