Saltar al contenido
CrossFly es 100% open sourceSíguenos en GitHub
CrossFlyCrossFly
Empezar

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 (el Label no 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 esqueleto MainWindow de 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) devuelve Label (para fluidez), no void — por eso el Label no declara implements TextComponent, a pesar de exponer setText/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 un VerticalLayout). Sin anchura conocida, solo los \n explí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 \n explícitos cuentan. Dale anchura al Label.
  • Confundir setText con el contrato TextComponent.setText: aquí setText devuelve Label, no void; el Label no implementa TextComponent.

Ver también

¿Te resultó útil esta página?