Saltar al contenido
CrossFly es 100% open sourceSíguenos en GitHub
CrossFlyCrossFly
Empezar

Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.

Cómo recibir un resultado de una pantalla

Propósito. Abres una pantalla para que el usuario elija/rellene algo y necesitas el valor de vuelta. CrossFly tiene dos mecanismos distintos: show(onAnswer) para pickers, y callback en el constructor para pantallas comunes.

APIs usadas

  • Window.show(RunnableWith<Object> onAnswer) — registra un callback de resultado. En la fuente, el callback solo se dispara si getAnswer() != null, y Window.getAnswer() devuelve null por defecto — solo Picker sobrescribe getAnswer(). Es decir: para pantallas comunes ese callback nunca se dispara.
  • Picker.getAnswer() — devuelve el valor elegido, o null si se canceló. Solo los pickers lo implementan.
  • Callback en el constructor — el patrón para pantallas comunes: pasa un RunnableWith<T> (o una interfaz propia) al constructor de la pantalla e invócalo antes de hide().

Ejemplo completo (copiar, pegar y ejecutar)

package com.exemplo;

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

/** Pantalla principal ejecutable: abre la pantalla de selección y recibe el resultado vía callback en el constructor. */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(new Label("Nenhum cliente escolhido"));
      add(new Button("Escolher cliente").onAction(e ->
         // PANTALLA COMÚN — resultado vía callback en el constructor (show(onAnswer) NO funciona aquí).
         new SelecionarClienteTela(cliente -> Hint.show("Escolhido: " + cliente.nome, 1500)).show()));
   }
}

/** Modelo simple de ejemplo. */
class Cliente
{
   final String nome;
   Cliente(String nome) { this.nome = nome; }
}

/** Pantalla de selección: entrega el resultado por el callback del constructor antes de cerrar. */
class SelecionarClienteTela extends Window
{
   private final RunnableWith<Cliente> onPick;

   public SelecionarClienteTela(RunnableWith<Cliente> onPick) { this.onPick = onPick; }

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());
      add(new Button("Escolher Ana").onAction(e ->
      {
         if (onPick != null) onPick.run(new Cliente("Ana"));  // entrega el resultado
         hide();                                              // luego cierra
      }));
   }
}

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

Fragmento mínimo

// verificado en la fuente: hide() solo llama a onAnswer.run(answer) cuando (this instanceof Picker) y answer != null

// 1) PICKER — usa show(onAnswer). Dispara SOLO con resultado no nulo (elección confirmada).
DatePicker picker = new DatePicker(/* ... */);
picker.show(answer ->
{
   Date d = (Date) answer;      // nunca es null aquí; cancelar NO dispara el callback
   Hint.show("Data: " + d, 1500);
});

// 2) PANTALLA COMÚN — resultado vía callback en el constructor (show(onAnswer) NO funciona aquí).
public class SelecionarClienteTela extends Window
{
   private final RunnableWith<Cliente> onPick;

   public SelecionarClienteTela(RunnableWith<Cliente> onPick) { this.onPick = onPick; }

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new GridLayout());
      add(new Button("Escolher Ana").onAction(e ->
      {
         if (onPick != null) onPick.run(new Cliente("Ana"));  // entrega el resultado
         hide();                                              // luego cierra
      }));
   }
}

// llamada:
new SelecionarClienteTela(cliente -> Hint.show("Escolhido: " + cliente.nome, 1500)).show();

¿Por qué dos caminos? hide() llama a onAnswer únicamente para Picker (el instanceof Picker está en el código de Window.hide()). Para pantallas comunes, el callback del constructor es el contrato explícito — y permite tipar el resultado (RunnableWith<Cliente>) en lugar de Object.

Profundiza

¿Te resultó útil esta página?