Label
Label é o widget de exibição mais usado: mostra texto somente-leitura, com quebra automática de linha (word-wrap), múltiplas linhas (explícitas via \n ou automáticas) e ícones opcionais à esquerda e/ou à direita. Não reage a toque — para ações use Button; para texto editável use TextField/TextArea.
A renderização é delegada ao Design ativo: o Label apenas calcula coordenadas em onLayout() e expõe campos públicos que o Design consome (fonte, cores e bordas vêm do LabelStyle).
🟢 · Pacote:
dev.crossfly.ui· Estende:Component· Estilo:LabelStyle
Quando usar
- Títulos, subtítulos, legendas e valores read-only.
- Texto com ícone informativo à esquerda ou à direita.
- Blocos de texto que precisam quebrar em várias linhas.
Quando NÃO usar
- Texto editável → use
TextField/TextArea. - Elemento tocável / clicável → use
Button(oLabelnão responde a toque).
Aparência
O texto é renderizado dentro da área interna (após ingap), alinhado horizontal e verticalmente conforme LabelStyle.textAlignH/textAlignV. O ícone esquerdo fica colado à borda interna esquerda; o direito à borda interna direita; o texto ocupa o espaço entre eles.
``
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());
// Label somente-leitura que será atualizado pelo botão
Label saida = new Label("Toque no botão abaixo");
add(LAY_AUTO, saida);
// Botão que muta o texto do Label (Label.setText é fluente e retorna Label)
Button ola = new Button("Dizer olá").onAction(c -> saida.setText("Olá, mundo!"));
add(LAY_AUTO, ola);
}
}
Os trechos abaixo mostram só o miolo (o que vai dentro de
onShow()). Para rodar, coloque-os no esqueletoMainWindowacima.
Uso básico
Label hello = new Label("Olá, mundo!");
container.add(LAY_AUTO, hello);
Construtores
| Construtor | Descrição |
|---|---|
Label() |
label vazio (text = "") |
Label(String text) |
label de texto |
Label(Icon onlIcon) |
label somente-ícone (ícone à esquerda) |
Propriedades e personalização
| Propriedade / método | Tipo | Padrão | O que faz |
|---|---|---|---|
setText(String) |
Label (fluente) |
— | troca o texto; invalida o layout só se o valor mudou |
leftIcon(Icon) |
Label (fluente) |
null |
define o ícone à esquerda do texto |
rightIcon(Icon) |
Label (fluente) |
null |
define o ícone à direita do texto |
text |
String (campo público) |
"" |
conteúdo atual (pode conter \n) |
estilo .textAlign(Position, Position) |
Position |
tema | alinhamento horizontal/vertical do texto |
estilo .backColor(int) / .borderColor(int) |
ARGB | tema | fundo/borda (use 0 para transparente) |
getAutoWidth() / getAutoHeight(int) |
int |
— | tamanhos preferidos (usados pelo layout) |
Label.wordWrap(String, Font, int) (static) |
String[] |
— | utilitário de quebra de linha por largura |
setText(String)retornaLabel(para fluência), nãovoid— por isso oLabelnão declaraimplements TextComponent, apesar de exporsetText/text.
Callbacks e eventos
Nenhum. Label é não interativo — não dispara onAction nem eventos de toque.
Estados
Sem estados de interação (não há pressed/focused). O visual muda apenas com o estilo aplicado ou via setEnabled(false) (aparência desabilitada, conforme o Design).
Ícone à esquerda e subtítulo sem fundo
// Label com ícone à esquerda (Material "info")
Label info = new Label("Informação")
.leftIcon(new MaterialIcon(""));
container.add(LAY_AUTO, info);
// Subtítulo alinhado à esquerda, sem fundo/borda
Label sub = new Label("Lista:").style(
Styles.theme().label(LabelRole.SUBTITLE)
.backColor(0)
.borderColor(0)
.textAlign(Position.START, Position.CENTER));
container.add(LAY_AUTO, sub);
Multilinha (word-wrap + \n explícito)
// Quebras explícitas
Label endereco = new Label("Rua das Flores, 123\nCentro\n01000-000");
// Word-wrap automático: dê largura ao Label (LAY_FILL) para a quebra ocorrer
Label paragrafo = new Label(
"Este texto longo quebra automaticamente em várias linhas quando "
+ "a largura disponível é menor que a largura do texto.");
container.add(LAY_FILL, paragrafo);
Boas práticas
- Para word-wrap, garanta que o layout dê largura ao
Label(ex.:add(LAY_FILL, label)numVerticalLayout). Sem largura conhecida, apenas os\nexplícitos são contados na altura. - Use papéis do tema (
LabelRole.TITLE/SUBTITLE/…) em vez de hard-codar fonte/cor.
Erros comuns
- Esperar word-wrap sem largura definida: se a largura é
0/desconhecida no cálculo de altura, só as quebras\nexplícitas contam. Dê largura aoLabel. - Confundir
setTextcom o contratoTextComponent.setText: aquisetTextretornaLabel, nãovoid; oLabelnão implementaTextComponent.