Como abrir e fechar uma tela
Propósito. No CrossFly não há “rotas”: toda tela é uma Window e a navegação é uma pilha. Abrir uma tela é show() (push); voltar é hide() (pop). A UI da tela deve ser montada em onShow().
APIs usadas
Window.show()— empilha a janela noEventsProcessore chamaonShow()(push). Se chamado fora da paint thread, agenda e aguarda.Window.hide()— desempilha a janela e chamaonRemove()(pop). Dispara a transição reversa, se houver.Window.onShow()— gancho de ciclo de vida chamado pelo framework ao empilhar; monte a UI aqui. Sempre chamesuper.onShow()primeiro (ele recalcula bounds e chamaonAdd(true)).EventsProcessor.topWindow()— retorna a janela no topo da pilha (a que recebe eventos).
Exemplo completo (copiar, colar e rodar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** 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(new Label("Tela inicial"));
add(new Button("Abrir detalhe").onAction(e -> new OutraTela().show())); // push
}
}
/** Tela empilhada; o botão "Voltar" faz pop (hide) e retorna à MainWindow. */
class OutraTela extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow(); // OBRIGATÓRIO: recalcula bounds e dispara onAdd()
setLayout(new VerticalLayout());
add(new Label("Detalhe do pedido"));
add(new Button("Voltar").onAction(e -> hide())); // pop: volta à tela anterior
}
}
O trecho abaixo mostra só o miolo. Para rodar, coloque-o no esqueleto
MainWindowacima.
Trecho mínimo
// verificado na fonte: Window.show()/hide()/onShow(); super.onShow() faz updateBounds()+onAdd(true)
public class MinhaTela extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow(); // OBRIGATÓRIO: recalcula bounds e dispara onAdd()
setLayout(new GridLayout());
add(new Label("Detalhe do pedido"));
add(new Button("Voltar").onAction(e -> hide())); // pop: volta à tela anterior
}
}
// Em qualquer lugar (ex.: no onAction de um botão da tela anterior):
new MinhaTela().show(); // push: empilha e exibe
Regras que evitam bugs:
- Nunca monte a UI no construtor que dependa do tamanho de tela —
Screen.width/heightsó está estabilizado quandoonShow()roda. UseonShow(). hide()fecha a própria janela. Para fechar a janela do topo a partir de fora, useEventsProcessor.topWindow().hide().show()é seguro fora da paint thread: ele reencaminha para a thread de pintura e aguarda.
Aprofunde-se
- Navegar entre telas · A pilha de janelas
- Receita irmã: Receber resultado de uma tela
Esta página foi útil?Obrigado pelo feedback!