本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。
Label
Label 是最常用的显示组件:显示只读文本,支持自动换行(word-wrap)、多行(通过 \n 显式或自动换行)以及左侧和/或右侧的可选图标。它不响应点击 —— 若需操作请使用 Button;若需可编辑文本请使用 TextField/TextArea。
渲染被委托给活跃的 Design:Label 仅在 onLayout() 中计算坐标,并暴露供 Design 使用的公共字段(字体、颜色和边框来自 LabelStyle)。
🟢 · 包:
dev.crossfly.ui· 继承:Component· 样式:LabelStyle
何时使用
- 标题、副标题、说明文字和只读值。
- 带左侧或右侧信息图标的文本。
- 需要换成多行的文本块。
何时不要使用
外观
文本在内部区域(应用 ingap 之后)内渲染,水平和垂直对齐依据 LabelStyle.textAlignH/textAlignV。左侧图标贴紧左内边界;右侧图标贴紧右内边界;文本占据两者之间的空间。
``
完整示例(复制、粘贴并运行)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** 可执行的主界面。将 launcher 指向此类(classname)并运行:gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
// 将由按钮更新的只读 Label
Label saida = new Label("Toque no botão abaixo");
add(LAY_AUTO, saida);
// 改变 Label 文字的按钮(Label.setText 为链式调用并返回 Label)
Button ola = new Button("Dizer olá").onAction(c -> saida.setText("Olá, mundo!"));
add(LAY_AUTO, ola);
}
}
下面的片段只展示核心部分(放入
onShow()内的内容)。要运行它们,请将其放入上面的MainWindow骨架中。
基本用法
Label hello = new Label("Olá, mundo!");
container.add(LAY_AUTO, hello);
构造函数
| 构造函数 | 描述 |
|---|---|
Label() |
空 label(text = "") |
Label(String text) |
文本 label |
Label(Icon onlIcon) |
仅图标的 label(图标在左侧) |
属性与自定义
| 属性 / 方法 | 类型 | 默认值 | 作用 |
|---|---|---|---|
setText(String) |
Label(链式) |
— | 更换文本;仅当值发生变化时才使布局失效 |
leftIcon(Icon) |
Label(链式) |
null |
定义文本左侧的图标 |
rightIcon(Icon) |
Label(链式) |
null |
定义文本右侧的图标 |
text |
String(公共字段) |
"" |
当前内容(可包含 \n) |
样式 .textAlign(Position, Position) |
Position |
主题 | 文本的水平/垂直对齐 |
样式 .backColor(int) / .borderColor(int) |
ARGB | 主题 | 背景/边框(使用 0 表示透明) |
getAutoWidth() / getAutoHeight(int) |
int |
— | 首选尺寸(供布局使用) |
Label.wordWrap(String, Font, int) (static) |
String[] |
— | 按宽度换行的工具方法 |
setText(String)返回Label(用于链式调用),而非void—— 因此尽管Label暴露了setText/text,它并不声明implements TextComponent。
回调与事件
无。Label 是非交互式的 —— 不触发 onAction,也不触发点击事件。
状态
没有交互状态(没有 pressed/focused)。视觉仅随所应用的样式变化,或通过 setEnabled(false) 变化(禁用外观,依据 Design)。
左侧图标与无背景的副标题
// 左侧带图标的 Label(Material "info")
Label info = new Label("Informação")
.leftIcon(new MaterialIcon(""));
container.add(LAY_AUTO, info);
// 左对齐副标题,无背景/边框
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);
多行(word-wrap + 显式 \n)
// 显式换行
Label endereco = new Label("Rua das Flores, 123\nCentro\n01000-000");
// 自动换行:给 Label 设置宽度 (LAY_FILL) 才会换行
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);
最佳实践
- 对于 word-wrap,请确保布局为
Label提供宽度(例如在VerticalLayout中add(LAY_FILL, label))。若无已知宽度,在高度计算中只会统计显式的\n。 - 使用主题角色(
LabelRole.TITLE/SUBTITLE/…)而不是硬编码字体/颜色。
常见错误
- 期望在未定义宽度时进行 word-wrap: 如果在高度计算中宽度为
0/未知,则只统计显式的\n换行。请为Label提供宽度。 - 混淆
setText与TextComponent.setText契约: 这里setText返回Label,而非void;Label并不实现TextComponent。
另请参阅
这个页面有帮助吗?感谢你的反馈!