4.5.2.2.8. TabSheet

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

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>

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

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

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

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

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

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

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

    @Inject
    private TabSheet tabsheet;
    
    private boolean detailsInitialized, historyInitialized;
    
    @Override
    public void init(Map<String, Object> params) {
    tabsheet.addListener(
            new TabSheet.TabChangeListener() {
                @Override
                public void tabChanged(TabSheet.Tab newTab) {
                    if ("detailsTab".equals(newTab.getName()))
                        initDetails();
                    else if ("historyTab".equals(newTab.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 приложения на разных мониторах. Отделяемая вкладка имеет специальную кнопку в заголовке:

Атрибуты tabSheet:

height visible    
id width    
stylename      

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