Pular para o conteúdo
CrossFly é 100% open sourceSiga no GitHub
CrossFlyCrossFly
Começar

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)

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)

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

Esta página foi útil?