# FilePicker

> Reservado — esqueleto vacío en la API 2026 (no produce resultado).

Source: https://crossfly.dev/es/docs/ui/widgets/filepicker — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# FilePicker

> 🔴 · **Paquete:** `dev.crossfly.ui.picker` · **Extiende:** `Picker` · **Estado: reservado (no disponible)**

`FilePicker` está **reservado** en la API 2026: en el código actual es solo un esqueleto vacío —

```java
public class FilePicker extends Picker {}
```

— sin constructores, campos, layout ni `getAnswer()` propio. **Hereda el `getAnswer()` de la base** ([`Picker`](/docs/ui/widgets/picker)), que devuelve `null`; por lo tanto **no produce resultado** y no debe usarse.

## Ejemplo completo (copiar, pegar y ejecutar)
`FilePicker` está **reservado** y no produce resultado (hereda `getAnswer()` de la base, que devuelve `null`). El ejemplo siguiente es ejecutable y demuestra **honestamente** esa limitación: muestra el picker, recoge el `getAnswer()` e informa que vino `null`. Para elegir medios de verdad, el botón contiguo usa la alternativa disponible, [`PhotoPicker`](/docs/ui/widgets/photopicker).

```java
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());

      Label saida = new Label("Resultado: —");
      add(LAY_AUTO, saida);

      // FilePicker es un esqueleto reservado: getAnswer() siempre devuelve null.
      Button tentarFilePicker = new Button("Tentar FilePicker (reservado)")
         .onAction(c ->
         {
            FilePicker fp = new FilePicker();
            fp.show(answer ->
               saida.setText("FilePicker devolveu: " + answer + " (reservado, sem resultado)"));
         });
      add(LAY_AUTO, tentarFilePicker);

      // Alternativa real para capturar medios: PhotoPicker.
      Button usarPhotoPicker = new Button("Alternativa: PhotoPicker")
         .onAction(c ->
         {
            PhotoPicker pp = new PhotoPicker(PhotoPicker.Preview.PHOTO);
            pp.show(answer ->
            {
               String caminho = (String) answer;
               if (pp.isError())
                  saida.setText("Erro de câmera: " + caminho);
               else
                  saida.setText("Foto salva em: " + caminho);
            });
         });
      add(LAY_AUTO, usarPhotoPicker);
   }
}
```

> Los fragmentos siguientes muestran **solo el núcleo** (lo que va dentro de `onShow()`). Para ejecutar, colócalos en el esqueleto `MainWindow` de arriba.

## Objetivo previsto
Navegar el sistema de archivos y devolver la ruta del archivo/carpeta seleccionado. El comentario en el fuente indica la intención de migrar desde un selector basado en árbol lazy a partir de un root — pero eso **todavía no se ha portado**.

## Lo que NO existe (no lo documentes como disponible)
La implementación anterior (árbol lazy con `Tree`/`TreeModel`, previsualización de imagen, volúmenes vía `Dropdown`, selección múltiple) **fue eliminada**, coherente con la eliminación del módulo `ui/tree` en la modernización. Las APIs antiguas — `Filter`, `initialPath`, `multipleSelection`, `mountTree`, `getTree`, etc. — **ya no existen**.

## Alternativas mientras está reservado
- Para capturar medios de la cámara, usa [`PhotoPicker`](/docs/ui/widgets/photopicker).
- Para elegir un color/fecha/hora, usa los pickers específicos.
- Trata `FilePicker` como no disponible hasta que el código tenga cuerpo.

## Ver también
- Guía del área: [`ui/`](/docs/ui) · Recetas: [`cookbook/`](/docs/cookbook)
- Base del patrón: [`Picker`](/docs/ui/widgets/picker)
