Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
Label
Label es el widget de visualización más usado: muestra texto de solo lectura, con salto de línea automático (word-wrap), múltiples líneas (explícitas vía \n o automáticas) e iconos opcionales a la izquierda y/o a la derecha. No reacciona al toque — para acciones usa Button; para texto editable usa TextField/TextArea.
El renderizado se delega al Design activo: el Label solo calcula coordenadas en onLayout() y expone campos públicos que el Design consume (fuente, colores y bordes vienen del LabelStyle).
🟢 · Paquete:
dev.crossfly.ui· Extiende:Component· Estilo:LabelStyle
Cuándo usar
- Títulos, subtítulos, leyendas y valores de solo lectura.
- Texto con icono informativo a la izquierda o a la derecha.
- Bloques de texto que necesitan quebrar en varias líneas.
Cuándo NO usar
- Texto editable → usa
TextField/TextArea. - Elemento tocable / clicable → usa
Button(elLabelno responde al toque).
Apariencia
El texto se renderiza dentro del área interna (tras ingap), alineado horizontal y verticalmente según LabelStyle.textAlignH/textAlignV. El icono izquierdo queda pegado al borde interno izquierdo; el derecho al borde interno derecho; el texto ocupa el espacio entre ellos.
``
Ejemplo completo (copiar, pegar y ejecutar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
// Label de solo lectura que será actualizado por el botón
Label saida = new Label("Toque no botão abaixo");
add(LAY_AUTO, saida);
// Botón que muta el texto del Label (Label.setText es fluido y devuelve Label)
Button ola = new Button("Dizer olá").onAction(c -> saida.setText("Olá, mundo!"));
add(LAY_AUTO, ola);
}
}
Los fragmentos siguientes muestran solo el núcleo (lo que va dentro de
onShow()). Para ejecutar, colócalos en el esqueletoMainWindowde arriba.
Uso básico
Label hello = new Label("Olá, mundo!");
container.add(LAY_AUTO, hello);
Constructores
| Constructor | Descripción |
|---|---|
Label() |
label vacío (text = "") |
Label(String text) |
label de texto |
Label(Icon onlIcon) |
label solo-icono (icono a la izquierda) |
Propiedades y personalización
| Propiedad / método | Tipo | Por defecto | Qué hace |
|---|---|---|---|
setText(String) |
Label (fluido) |
— | cambia el texto; invalida el layout solo si el valor cambió |
leftIcon(Icon) |
Label (fluido) |
null |
define el icono a la izquierda del texto |
rightIcon(Icon) |
Label (fluido) |
null |
define el icono a la derecha del texto |
text |
String (campo público) |
"" |
contenido actual (puede contener \n) |
estilo .textAlign(Position, Position) |
Position |
tema | alineación horizontal/vertical del texto |
estilo .backColor(int) / .borderColor(int) |
ARGB | tema | fondo/borde (usa 0 para transparente) |
getAutoWidth() / getAutoHeight(int) |
int |
— | tamaños preferidos (usados por el layout) |
Label.wordWrap(String, Font, int) (static) |
String[] |
— | utilitario de salto de línea por anchura |
setText(String)devuelveLabel(para fluidez), novoid— por eso elLabelno declaraimplements TextComponent, a pesar de exponersetText/text.
Callbacks y eventos
Ninguno. Label no es interactivo — no dispara onAction ni eventos de toque.
Estados
Sin estados de interacción (no hay pressed/focused). El visual cambia solo con el estilo aplicado o vía setEnabled(false) (apariencia deshabilitada, según el Design).
Icono a la izquierda y subtítulo sin fondo
// Label con ícono a la izquierda (Material "info")
Label info = new Label("Informação")
.leftIcon(new MaterialIcon(""));
container.add(LAY_AUTO, info);
// Subtítulo alineado a la izquierda, sin fondo/borde
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);
Multilínea (word-wrap + \n explícito)
// Saltos explícitos
Label endereco = new Label("Rua das Flores, 123\nCentro\n01000-000");
// Word-wrap automático: dé ancho al Label (LAY_FILL) para que ocurra el salto
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);
Buenas prácticas
- Para word-wrap, garantiza que el layout dé anchura al
Label(ej.:add(LAY_FILL, label)en unVerticalLayout). Sin anchura conocida, solo los\nexplícitos se cuentan en la altura. - Usa roles del tema (
LabelRole.TITLE/SUBTITLE/…) en vez de hard-codear fuente/color.
Errores comunes
- Esperar word-wrap sin anchura definida: si la anchura es
0/desconocida en el cálculo de altura, solo los saltos\nexplícitos cuentan. Dale anchura alLabel. - Confundir
setTextcon el contratoTextComponent.setText: aquísetTextdevuelveLabel, novoid; elLabelno implementaTextComponent.