tabSheet

Контейнер, который создает несколько вкладок с содержимым. Одновременно видно только содержимое выбранной вкладки.

XML-элемент

tabSheet

Java-класс

JmixTabSheet

Атрибуты

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

Обработчики

AttachEvent - DetachEvent - SelectedChangeEvent

Элементы

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, выберите компонент в XML-дескрипторе экрана или на панели структуры Jmix UI и нажмите кнопку Add→Tab на панели Component Inspector.

XML-элемент

tab

Java-класс

Tab

Атрибуты

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

Обработчики

AttachEvent - DetachEvent

Элементы

tooltip

Количество вкладок

Компонент tabSheet может иметь любое практическое количество вкладок. Для адаптации к доступному пространству компонент добавит кнопки прокрутки, обеспечивая доступность всех вкладок для пользователей.

tabsheet tabs number

Состояния

Состояние вкладки позволяет пользователям легко определить, какая вкладка активна в данный момент, а какие могут быть временно недоступны или отключены. Вкладка может быть выбрана, не выбрана или отключена.

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();
}

Ленивые вкладки

Вкладка может быть настроена на ленивую загрузку своего содержимого, что означает, что содержимое загружается только когда пользователь выбирает эту конкретную вкладку. Это уменьшает количество компонентов в памяти.

Чтобы включить ленивую загрузку, установите атрибут lazy элемента tab в 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, который позволяет выбрать среди шести различных вариантов:

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

Смотрите также

Дополнительную информацию смотрите в документации Vaadin.