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 sigetAnswer() != null, yWindow.getAnswer()devuelvenullpor defecto — soloPickersobrescribegetAnswer(). Es decir: para pantallas comunes ese callback nunca se dispara.Picker.getAnswer()— devuelve el valor elegido, onullsi 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 dehide().
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
MainWindowde 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
- Devolviendo resultados · Navegar entre pantallas
- Receta hermana: Abrir y cerrar una pantalla
¿Te resultó útil esta página?¡Gracias por tu opinión!