# Navegar entre telas

> Avançar e voltar entre telas (push/pop) e passar dados para a tela de destino.

Source: https://crossfly.dev/pt/docs/ui/navigation/navigate-between-screens — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Navegar entre telas

## O que você vai aprender
- Avançar para uma nova tela (`show()`) e voltar (`hide()`).
- **Passar dados** para a tela de destino.
- Onde montar a UI de cada tela.

## Pré-requisitos
Entender que toda tela é uma subclasse de `Window` e que a UI é montada em `onShow()`.

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

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

/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(LAY_AUTO, new Label("Lista"));

      Button abrir = new Button("Abrir detalhe do item 42");
      abrir.onAction(c -> new TelaDetalhe(42).show());   // push (avança) — dados pelo construtor
      add(LAY_AUTO, abrir);
   }
}

/** Segunda tela: recebe o id pelo construtor e volta com hide(). */
class TelaDetalhe extends Window
{
   private final int id;

   public TelaDetalhe(int id) { this.id = id; }   // dados vêm pelo construtor

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(LAY_AUTO, new Label("Detalhe do item " + id));

      Button voltar = new Button("Voltar");
      voltar.onAction(c -> hide());   // pop (volta)
      add(LAY_AUTO, voltar);
   }
}
```
> Os trechos abaixo mostram **só o miolo** (o que vai dentro de `onShow()`). Para rodar, coloque-os no esqueleto `MainWindow` acima.

## Avançar (push) e voltar (pop)
```java
public class TelaLista extends Window {
   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      Button abrir = new Button("Abrir detalhe");
      abrir.onAction(c -> new TelaDetalhe(42).show());   // push (avança)
      add(LAY_AUTO, abrir);
   }
}

public class TelaDetalhe extends Window {
   private final int id;
   public TelaDetalhe(int id) { this.id = id; }          // dados vêm pelo construtor
   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      add(LAY_AUTO, new Label("Detalhe do item " + id));
      Button voltar = new Button("Voltar");
      voltar.onAction(c -> hide());                       // pop (volta)
      add(LAY_AUTO, voltar);
   }
}
```

## Passar dados para a tela seguinte
Não existem "argumentos de rota". **Passe pelo construtor** da `Window` de destino (como `id` acima).
Para objetos, passe a referência: `new TelaCliente(cliente).show();`.

## Onde montar a UI
- **`onShow()`** (com `super.onShow()`): aqui `Screen.width/height` e os bounds da janela já são válidos.
- **Não** monte no construtor — os bounds podem não estar prontos.

## Boas práticas
- Carregue dados **fora da paint thread** e volte com `Component.onUI(...)` para preencher a UI.
- Libere recursos (timers, cursores) em `onRemove()`.

## Erros comuns
- Montar a UI no construtor (bounds inválidos) ou esquecer `super.onShow()`.
- Esperar um "back-stack com argumentos nomeados" — passe dados pelo construtor.

## Veja também
- [Retornar valores de uma tela](/docs/ui/navigation/returning-results) · [A pilha de janelas](/docs/ui/navigation/the-window-stack)
