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.

Picker (clase base)

Picker es la base común de todas las ventanas de selección de CrossFly (fecha, hora, archivo, foto, color, código de barras, coordenada). Cada picker se abre, deja que el usuario interactúe y, al confirmar, se cierra solo entregando el resultado de forma asíncrona, mediante callback, al código que lo abrió.

Entender el patrón de esta página es entender todos los pickers de una vez.

🟡 · Paquete: dev.crossfly.ui.picker · Extiende: Window · Transición: FADE por defecto

El patrón central: getAnswer() + show(onAnswer)

  • Picker.getAnswer() produce el valor seleccionado (cada subclase lo sobrescribe para devolver el tipo concreto: String, Integer, LatLon…). En la base, retorna null.
  • Window.show(RunnableWith<Object> onAnswer) consume ese valor cuando la ventana se cierra.

El vínculo entre ambos está en Window.hide():

public void hide() {
   ...
   Object answer = this instanceof Picker ? ((Picker) this).getAnswer() : null;
   if (onAnswer != null && answer != null)
      onAnswer.run(answer);
   ...
}

Consecuencias prácticas (todas confirmadas en el código):

  • El callback onAnswer solo se dispara en hide() y únicamente si getAnswer() != null. Al cancelar, las subclases hacen que getAnswer() retorne null — así que onAnswer no se llama. Quien necesite reaccionar a la cancelación debe sobrescribir onHide()/onRemove() o usar el callback específico de la subclase.
  • show(onAnswer) es thread-safe: si se llama fuera de la paint thread, se reprograma y bloquea hasta concluir.
  • El valor entregado es Object; el consumidor hace cast al tipo concreto del picker.

Esto contrasta con Alert/ActionSheet, que extienden Window pero no Picker — en ellos show(onAnswer) no se dispara y la respuesta llega por callbacks de botón.

Ejemplo completo (copiar, pegar y ejecutar)

package com.exemplo;

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

/** 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());

      Button abrir = new Button("Abrir picker");
      abrir.onAction(c ->
      {
         // Cualquier subclase de Picker sigue el mismo patrón show(onAnswer)
         DatePicker dp = new DatePicker();
         dp.show(answer ->
         {
            // 'answer' es el Object devuelto por getAnswer(); solo llega aquí si != null
            String data = (String) answer;
            Hint.show("Selecionado: " + data, 2000);
         });
      });
      add(LAY_AUTO, abrir);
   }
}

Los fragmentos de abajo muestran solo el núcleo (lo que va dentro de onShow()). Para ejecutarlos, colócalos en el esqueleto MainWindow de arriba.

Uso básico (forma genérica de cualquier picker)

DatePicker dp = new DatePicker();
dp.show(answer ->
{
   // 'answer' es el Object devuelto por getAnswer(); solo llega aquí si != null
   String data = (String) answer;
   Debug.log("Selecionado: " + data);
});

Métodos públicos

Método Retorno Descripción
getAnswer() Object Resultado del picker, o null si se canceló. Sobrescrito por cada subclase.
show(RunnableWith<Object> onAnswer) void Abre el picker; entrega el valor mediante callback al cerrarse (heredado de Window).

Tipos devueltos por subclase

Picker getAnswer() devuelve
DatePicker String (fecha según LocaleFormats.dateFormat/dateSeparator)
TimePicker String (HH:MM, 24h)
FilePicker — (esqueleto vacío; hereda null de la base)
PhotoPicker String (ruta o "ERROR: ...")
ColorPicker Integer (RGB sin alpha)
BarcodePicker String (payload leído)
LocationPicker LatLon

Buenas prácticas

  • Haz siempre el cast del Object al tipo concreto de la tabla anterior.
  • Para reaccionar a la cancelación, no cuentes con onAnswer — usa el callback específico (onSelect/onCapture) o sobrescribe onHide().
  • Los pickers de hardware (PhotoPicker, BarcodePicker, LocationPicker) liberan recursos al cerrarse; no reutilices la misma instancia tras hide().

Errores comunes

  • Esperar onAnswer en la cancelación — no se dispara, porque getAnswer() devuelve null.
  • Olvidar el cast — el callback recibe Object.

Véase también

¿Te resultó útil esta página?