tabSheet 标签面板

一个可以创建多个包含内容的标签页的布局容器。每次只显示选中标签页的内容。

XML 元素

tabSheet

Java 类

JmixTabSheet

XML 属性

id - alignSelf - classNames - colspan - css - height - maxHeight - maxWidth - minHeight - minWidth - themeNames - visible - width

事件和处理器

AttachEvent - DetachEvent - SelectedChangeEvent

XML 内部元素

tab

基本用法

在 XML 中添加 tabSheet 创建该组件,内部可添加多个 tab 元素。每个 tab 只能包含一个子组件。多个子组件必须通过布局组件包装,比如 vbox 垂直盒子

下面示例展示了 tabSheet 的基本用法:

<tabSheet>
    <tab id="tab1" label="Tab One">
        <vbox>
            <label text="Label One"/>
            <textField placeholder="Text Field One"/>
        </vbox>
    </tab>
    <tab id="tab2" label="Tab Two">
        <label text="Label Two"/>
    </tab>
    <tab id="tab3" label="Tab Three">
        <label text="Label Three"/>
    </tab>
</tabSheet>
tabsheet basic

tab 元素

tab 的内容通过 tab 元素描述。

如需在 Jmix Studio 中添加 tab,可以在视图 XML 或者 Jmix UI 结构面板中选择组件,然后点击 Jmix UI 组件属性面板的 Add→Tab 按钮。

XML 元素

tab

Java 类

Tab

XML 属性

id - ariaLabel - ariaLabelledBy - classNames - colspan - css - enabled - flexGrow - label - lazy - themeNames - visible

事件和处理器

AttachEvent - DetachEvent

XML 内部元素

tooltip

标签页数量

tabSheet 组件可以支持任何实际数量的标签页。标签页过多时,为了适配可用空间,组件会自动添加滚动按钮,确保用户可以访问所有的标签页。

tabsheet tabs number

标签页状态

用户可以通过标签页状态判断哪个是目前使用的标签页,以及哪些标签页可能暂时不可用或被禁用。一个 tab 可以被选择、不选择或被禁用。

tabs states

自定义标签

标签页的标签不仅可以使用纯文本,还可以通过编程的方式包含几乎任意组件。

tabsheet labels

徽标

一个特别有用的场景是为标签添加动态徽标。徽标可以显示标签页内容中条目、通知或其他内容的的数量。

tabsheet badges

标签页切换

当用户切换标签页时,会发送 io.jmix.flowui.component.tabsheet.JmixTabSheet.SelectedChangeEvent。可以创建事件的处理方法在用户切换标签时执行自定义代码。

下面的代码在每次切换标签页时显示一个通知:

@Subscribe("tabSheet")
public void onTabSheetSelectedChange(final JmixTabSheet.SelectedChangeEvent event) {
    notifications.create(event.getSelectedTab() + " is now selected").show();
}

延迟加载

标签页可以配置内容的延迟加载,即仅当用户选择该标签页时才会加载其内容。这样可以减少内存中的组件数量。

要启用延迟加载,请将 tab 元素的 lazy 属性设置为 '`true`:

<tabSheet id="tabSheet">
    <tab id="normalTab" label="Normal Tab">
        <vbox>
            <textField placeholder="textField"/>
            <button text="button"/>
        </vbox>
    </tab>
    <tab id="lazyTab" label="Lazy Tab" lazy="true">
        <vbox>
            <button text="button"/>
            <textField placeholder="textField"/>
        </vbox>
    </tab>
</tabSheet>

当视图打开时,延迟加载标签页内的组件还不存在,因此无法注入到控制器,也无法在视图生命周期事件方法中获取。只有在用户打开标签页后,才能访问这些组件。通过 SelectedChangeEvent 事件的处理方法可以检测用户选择了哪个标签页,然后使用 UiComponentUtils.getComponent() 方法获取需要的组件。

在下面的示例中,第二个标签页设置为延迟加载,当用户选择时才加载其内容。每个标签页中的当前组件数在上方的 span 中显示。

tabsheet lazy
@ViewComponent
private Span contentInfo;
@ViewComponent
private JmixTabSheet tabSheet;
@Autowired
private Notifications notifications;

@Subscribe
public void onInit(final InitEvent event) {
    checkTabsContent();
}
@Subscribe("tabSheet")
public void onTabSheetSelectedChange(final JmixTabSheet.SelectedChangeEvent event) {
    checkTabsContent();
}

protected void checkTabsContent () {
    StringBuilder sb = new StringBuilder();
    List<Component> tab1Content = tabSheet.getContentByTab(tabSheet.getTabAt(0)).getChildren().toList();
    sb.append(tab1Content.isEmpty() ? "Empty" :  tab1Content.size() + " components");

    sb.append(" / ");
    List<Component> tab2Content = tabSheet.getContentByTab(tabSheet.getTabAt(1)).getChildren().toList();
    sb.append(tab2Content.isEmpty() ? "Empty" : tab2Content.size() + " components");

    contentInfo.setText(sb.toString());
}

样式版本

通过 themeNames 属性调整组件的外观,支持 6 个不同的选项:

centered

将标签页放置在容器或视图的中间,而不是靠左对齐:

tabs centered
small

使用小尺寸标签页:

tabs small

minimal

仅展示标签页的标签,不显示其他可视化元素

tabs minimal

hide-scroll-buttons

隐藏用于滚动标签页的按钮:

tabs hide scroll buttons

equal-width-tabs

每个标签页调整为等宽,并禁用滚动按钮:

tabs equal width

bordered

为标签页和内容添加边框。

tabsheet bordered

参考