Using Components
组件是 webforJ 应用程序的构建块。无论您是使用内置组件,例如 Button 和 TextField,还是使用您团队提供的自定义组件,与它们的交互方式遵循相同的一致模型:您配置属性、管理状态,并将组件组合成布局。
本指南重点介绍这些日常操作:不是组件如何工作的内部原理,而是如何在实践中完成工作。
组件属性
每个组件都暴露出控制其内容、外观和行为的属性。这些大多数都有专门的、类型化的 Java 方法(setText()、setTheme()、setExpanse() 等),这是您在 webforJ 中配置组件的主要方式。以下部分涵盖适用于各组件类型的属性和方法。
文本内容
setText() 方法设置组件的可见文本,如 Button 上的标题或 Label 的内容。对于像 TextField 这样的输入组件,请使用 setValue() 来设置字段的当前值。
Button button = new Button();
button.setText("点击我");
Label label = new Label();
label.setText("状态:准备就绪");
TextField field = new TextField();
field.setValue("初始值");
某些组件还支持 setHtml(),用于需要内容中内联 HTML 标记的情况:
Div container = new Div();
container.setHtml("<strong>粗体文本</strong> 和 <em>斜体文本</em>");
HTML 属性
在 webforJ 中,大多数配置是通过类型化的 Java 方法而不是原始 HTML 属性完成的。然而,setAttribute() 对于传递没有专门 API 的可访问性属性是很有用的:
Button button = new Button("提交");
button.setAttribute("aria-label", "提交表单");
button.setAttribute("aria-describedby", "form-hint");
并不是所有组件都支持任意属性。这取决于底层组件的实现。
组件 IDs
您可以使用 setAttribute() 将 ID 分配给组件的 HTML 元素:
Button submitButton = new Button("提交");
submitButton.setAttribute("id", "submit-btn");
TextField emailField = new TextField("电子邮件");
emailField.setAttribute("id", "email-input");
DOM ID 通常用于测试选择器和样式表中的 CSS 定位。
与 CSS 类不同,ID 在您的应用程序中应该是唯一的。如果您需要定位多个组件,请使用 addClassName()。
webforJ 还会在内部自动分配标识符给组件。服务器端 ID(通过 getComponentId() 访问)用于框架跟踪,而客户端 ID(通过 getClientComponentId() 访问)用于客户端与服务器的通信。这些与您使用 setAttribute() 设置的 DOM id 属性是分开的。
样式
三个方法覆盖了大多数样式需求:setStyle() 用于单个 CSS 属性值,addClassName() 和 removeClassName() 用于应用或删除在样式表中定义的 CSS 类。
对于小的或一次性的样式调整,请使用 setStyle(),而使用 CSS 类可以应用更大或可重用的样式。
Div container = new Div();
container.setStyle("padding", "20px");
if (isHighPriority) {
container.setStyle("border-left", "4px solid red");
}
Button button = new Button("切换");
button.addClassName("primary", "large");
if (isLoading) {
button.addClassName("loading");
}
@InlineStyleSheet 是一种旧方法,通常不推荐在新项目中使用。在大多数情况下,请将样式保留在单独的 CSS 文件中。
组件状态
除了内容和外观,组件还有确定其是否可见以及是否响应用户交互的状态属性。最常用的两个是 setVisible() 和 setEnabled()。
setVisible() 控制组件是否在 UI 中呈现。setEnabled() 控制它在保持可见的同时是否接受输入或交互。在大多数情况下,禁用比隐藏更可取:禁用的按钮仍然传达存在某个操作,但目前不可用,这比出现和消失的状态更少令人困惑。
// 当复选框被选中时显示额外的字段
TextField advancedField = new TextField("高级设置");
advancedField.setVisible(false);
CheckBox enableAdvanced = new CheckBox("显示高级设置");
enableAdvanced.addValueChangeListener(e -> advancedField.setVisible(e.getValue()));
// 仅在必填字段有值时启用按钮
Button submitButton = new Button("提交");
submitButton.setEnabled(false);
TextField nameField = new TextField("姓名");
nameField.addValueChangeListener(e -> submitButton.setEnabled(!e.getValue().isBlank()));
以下登录表单展示了 setEnabled() 的实际应用。只有当两个字段都有内容时,登录按钮才会启用,这清楚地向用户表明在继续之前需要输入:
显示代码
- ConditionalStateView.java
- conditionalstate.css
与容器一起工作
在 webforJ 中,布局由容器处理,它们是保存其他组件并控制其排列方式的组件。您不需要手动定位子组件;相反,您将它们添加到容器中并配置该容器的布局属性。