5.5.2.2.11. TabSheet

Контейнер TabSheet - это панель с вкладками (tabs). В один момент времени отображается содержимое только одной вкладки.

gui tabsheet

XML-имя компонента: tabSheet.

Пример описания панели с вкладками в XML-дескрипторе экрана:

<tabSheet>
    <tab id="mainTab" caption="Tab1" margin="true" spacing="true">
        <dateField datasource="orderDs" property="date" caption="Date"/>
        <lookupField datasource="orderDs" property="customer" optionsDatasource="customersDs" caption="Customer"/>
    </tab>
    <tab id="additionalTab" caption="Tab2" margin="true" spacing="true">
        <textField datasource="orderDs" property="amount" caption="Amount"/>
    </tab>
</tabSheet>

Атрибут description контейнера tabSheet задаёт текст подсказки, отображаемой при наведении курсора мыши или клике в области вкладок контейнера.

gui tabsheet description

Компонент tabSheet должен иметь вложенные элементы tab, описывающие вкладки. Каждая вкладка является контейнером с вертикальным расположением компонентов, аналогичным vbox.

Атрибуты элемента tab:

  • id - идентификатор вкладки. Следует отметить, что вкладка не является компонентом, и данный идентификатор используется только в рамках TabSheet для работы с ней из кода контроллера.

  • caption - заголовок вкладки.

  • description - текст подсказки, отображаемой при наведении курсора мыши или клике на конкретную вкладку.

    gui tabsheet tab description
  • closable - определяет, будет ли отображаться кнопка x для закрытия вкладки. Значение по умолчанию - false.

  • icon - указывает на местоположение значка в каталоге темы или его имя в используемом наборе значков. Применяется только для блока Web Client. Подробную информацию о том, где следует располагать файлы значков, можно прочитать в разделе Значки.

  • lazy - задает отложенную загрузку содержимого вкладки.

    При открытии экрана lazy-вкладки не загружают свое содержимое, что приводит к созданию меньшего количества компонентов в памяти. Компоненты вкладки загружаются только в тот момент, когда пользователь выбирает данную вкладку. Кроме того, если на lazy-вкладке расположены визуальные компоненты, связанные с источником данных, содержащим JPQL запрос, то этот запрос также не выполняется. В результате экран открывается быстрее, а данные загружаются только в тот момент, когда пользователь действительно хочет их увидеть, выбирая данную вкладку.

    Следует иметь в виду, что компоненты, расположенные на lazy-вкладке, не существуют в момент открытия экрана. Поэтому их нельзя инжектировать в контроллер, и нельзя получить вызовом getComponent() в методе init() контроллера. Обратиться к компонентам lazy-вкладки можно только после того, как пользователь на нее переключился. Этот момент можно отловить с помощью слушателя TabSheet.SelectedTabChangeListener, например:

    @Inject
    private TabSheet tabsheet;
    
    private boolean detailsInitialized, historyInitialized;
    
    @Override
    public void init(Map<String, Object> params) {
        tabsheet.addSelectedTabChangeListener(event -> {
            if ("detailsTab".equals(event.getSelectedTab().getName())) {
                initDetails();
            } else if ("historyTab".equals(event.getSelectedTab().getName())) {
                initHistory();
            }
        });
    }
    
    private void initDetails(){
        if (detailsInitialized) {
            return;
        }
        // use getComponentNN("comp_id") here to get tab's components
        detailsInitialized=true;
    }
    
    private void initHistory(){
        if (historyInitialized) {
            return;
        }
        // use getComponentNN("comp_id") here to get tab's components
        historyInitialized = true;
    }

    По умолчанию вкладки не являются lazy, а значит, загружают свое содержимое в момент открытия экрана.

  • detachable - значение true в десктоп-реализации экрана дает возможность отсоединять вкладку в отдельное окно. Это позволяет, например, размещать части UI приложения на разных мониторах. Отделяемая вкладка имеет специальную кнопку в заголовке:

    gui tabsheetDetachable
    Стили TabSheet

    В веб-клиенте с темой, основанной на Halo, к контейнеру TabSheet можно применить предопределенные стили. Стили задаются в XML-дексрипторе или контроллере экрана с помощью атрибута stylename:

    <tabSheet stylename="framed">
        <tab id="mainTab" caption="Framed tab"/>
    </tabSheet>

    Чтобы применить стиль программно, выберите одну из констант класса HaloTheme с префиксом компонента TABSHEET_:

    tabSheet.setStyleName(HaloTheme.TABSHEET_COMPACT_TABBAR);
    • centered-tabs - центрирует вкладки на панели. Подходит для страниц, где все вкладки целиком помещаются на панели (т.е. нет прокрутки вкладок).

    • compact-tabbar - уменьшает отступы вокруг вкладок.

    • equal-width-tabs - задаёт всем вкладкам на панели равный размер (т.е. expand ratio == 1 для всех вкладок). Заголовки вкладок будут обрезаны, если они не поместятся на вкладку целиком. Прокрутка вкладок в этом случае не работает (будут видны одновременно все вкладки).

    • framed - добавляет рамку как вокруг всего контейнера целиком, так и вокруг каждой вкладки на панели.

    • icons-on-top - располагает значок вкладки над её заголовком (по умолчанию значки располагаются слева от заголовка).

    • only-selected-closeable - только выделенная вкладка имеет кнопку закрытия. Стиль не запрещает программного закрытия вкладок, а только скрывает кнопку от пользователя.

    • padded-tabbar - добавляет небольшие отступы вокруг вкладок на панели, так что они не касаются границ контейнера.