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

RandomLayout

Não arranja nada automaticamente: cada filho precisa de bounds. É o layout padrão quando você chama add(...) sem definir um layout. Apesar do nome, é a base de overlays e cards flutuantes.

🔴 · Pacote: dev.crossfly.ui.layout · Estende: Layout

Quando usar

  • Overlays, cards flutuantes, posicionamento livre.
  • Layouts custom onde você controla os bounds.

Quando NÃO usar

  • Telas normais → use um layout que arranja (Vertical/Horizontal/Grid).

add(...)

public Layout add(Object... params);   // apenas coleta os componentes; não os posiciona

Duas formas de posicionar

  1. Manual (pixels — NÃO responsivo): filho.setBounds(x, y, w, h).
  2. Relativo (responsivo — recomendado): filho.setRelativeBounds(Relative x, Relative y, Relative w, Relative h). O doLayout() do RandomLayout chama Relative.setBounds(c) automaticamente para todo filho com bounds relativos.

Exemplo completo (copiar, colar e rodar)

package com.exemplo;

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

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

      // A própria Window usa RandomLayout por padrão (sem setLayout)
      Component card = new Component();
      card.setLayout(new VerticalLayout(Position.START, Position.START));
      card.add(LAY_AUTO, new Label("Cartão flutuante"));
      card.setRelativeBounds(
         Relative.CENTER,                            // x: centralizado
         Relative.CENTER,                            // y: centralizado
         Relative.ofScreen(0.8f, ScreenSize.MIN),   // largura: 80% do menor lado
         Relative.ofFont(10f)                       // altura: 10 linhas de fonte
      );
      add(card);                                     // RandomLayout resolve os bounds relativos
   }
}

Os trechos abaixo mostram só o miolo (o que vai dentro de onShow()). Para rodar, coloque-os no esqueleto MainWindow acima.

Uso básico (card centralizado responsivo)

Component overlay = new Component();          // sem setLayout → RandomLayout
Component card = new Component();
card.setRelativeBounds(
   Relative.CENTER,                            // x: centralizado
   Relative.CENTER,                            // y: centralizado
   Relative.ofScreen(0.8f, ScreenSize.MIN),   // largura: 80% do menor lado
   Relative.ofFont(10f)                       // altura: 10 linhas de fonte
);
overlay.add(card);                             // RandomLayout resolve os bounds relativos

Boas práticas

  • Prefira setRelativeBounds a setBounds — mantém a responsividade.
  • Se precisar de setBounds fixo, recalcule em Window.onReposition() (chamado no resize).

Erros comuns

  • Usar setBounds(x,y,w,h) fixo e a UI quebrar em outra tela/densidade.
  • Esquecer que sem bounds (nem fixos, nem relativos) o filho fica em (0,0) com tamanho 0.

Veja também

Esta página foi útil?