tabSheet
tabSheet организует содержимое по вкладкам и отображает по одной вкладке за раз.
XML-элемент |
|
|---|---|
Java-класс |
|
Основы
Добавьте элементы tab в tabSheet. Каждая вкладка принимает один компонент содержимого. Несколько компонентов поместите в контейнер, например vbox.
Следующий пример демонстрирует создание базового tabSheet:
<tabSheet width="100%">
<tab id="tab1" label="Tab 1">
<vbox>
<span text="Span 1"/>
<textField label="TextField 1"/>
<button text="Button 1"/>
</vbox>
</tab>
<tab id="tab2" label="Tab 2">
<vbox>
<span text="Span 2"/>
<textField label="TextField 2"/>
<button text="Button 2"/>
</vbox>
</tab>
</tabSheet>
Количество вкладок
Если надписи вкладок не помещаются по доступной ширине, на панели появляются кнопки прокрутки, с помощью которых можно открыть остальные вкладки.
Состояния
Состояние вкладки позволяет пользователям легко определить, какая вкладка активна в данный момент, а какие могут быть временно недоступны или отключены. Вкладка может быть выбрана, не выбрана или отключена.
Пользовательские надписи
Создайте Tab программно, чтобы использовать рядом с текстовой надписью другие компоненты, например значки. В примере создаются три надписи из значка и текста. В теме Lumo значки можно расположить над текстом.
<layout>
<!-- theme-only:lumo -->
<checkbox id="iconControlCheckbox" label="Icon on top"/>
<!-- theme-only:lumo:end -->
<tabSheet id="tabSheet" width="100%"/>
</layout>
@ViewComponent
protected JmixTabSheet tabSheet;
@Autowired
protected UiComponents uiComponents;
@Subscribe
protected void onInit(InitEvent event) {
initTabSheet();
}
protected void initTabSheet() {
tabSheet.add(createProfileTab(), new Span("Profile tab content"));
tabSheet.add(createNotificationsTab(), new Span("Notifications tab content"));
tabSheet.add(createSettingsTab(), new Span("Settings tab content"));
}
// theme-only:lumo
@Subscribe("iconControlCheckbox")
protected void onIconControlCheckboxValueChane(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
if (event.getValue()) {
tabSheet.getChildren().forEach(tab -> ((Tab) tab).addThemeVariants(TabVariant.LUMO_ICON_ON_TOP));
} else {
tabSheet.getChildren().forEach(tab -> tab.getElement().getThemeList().clear());
}
}
// theme-only:lumo:end
protected Tab createProfileTab() {
Tab tab = uiComponents.create(Tab.class);
tab.add(VaadinIcon.USER.create(), new Text("Profile"));
return tab;
}
protected Tab createNotificationsTab() {
Tab tab = uiComponents.create(Tab.class);
tab.add(VaadinIcon.BELL.create(), new Text("Notifications"));
return tab;
}
protected Tab createSettingsTab() {
Tab tab = uiComponents.create(Tab.class);
tab.add(VaadinIcon.COG.create(), new Text("Settings"));
return tab;
}
Бейджи
Бейджи в надписях вкладок могут показывать количество элементов, уведомления или другую краткую информацию о состоянии. В примере каждая надпись состоит из текста и оформленного темой span со счётчиком.
<layout classNames="tab-sheet-badges">
<tabSheet id="tabSheet" width="100%"/>
</layout>
@ViewComponent
protected JmixTabSheet tabSheet;
@Autowired
protected UiComponents uiComponents;
@Subscribe
protected void onInit(InitEvent event) {
initTabSheet();
}
protected void initTabSheet() {
tabSheet.add(createIssueTab(), new Span("Issue tab content"));
tabSheet.add(createFeatureTab(), new Span("Feature tab content"));
tabSheet.add(createBugTab(), new Span("Bug tab content"));
}
protected Tab createIssueTab() {
Tab tab = uiComponents.create(Tab.class);
tab.add(new Span("Issues"), createBadge(15, "contrast"));
return tab;
}
protected Tab createFeatureTab() {
Tab tab = uiComponents.create(Tab.class);
tab.add(new Span("Features"), createBadge(132, "success"));
return tab;
}
protected Tab createBugTab() {
Tab tab = uiComponents.create(Tab.class);
tab.add(new Span("Bugs"), createBadge(32, "error"));
return tab;
}
protected Span createBadge(int value, String theme) {
Span badge = new Span(String.valueOf(value));
badge.getElement().getThemeList().add("badge small " + theme);
badge.addClassName("tab-badge");
return badge;
}
Ленивые вкладки
Ленивая вкладка создаёт содержимое только при выборе, поэтому при открытии экрана создаётся меньше компонентов. В примере экземпляры LazyComponent добавляются программно, а изменения выбранной вкладки отслеживаются, чтобы показать момент создания содержимого.
<layout>
<tabSheet id="tabSheet" width="100%" themeNames="bordered">
<tab id="tab1" label="Tab 1">
<vbox>
<span text="Span 1"/>
<textField label="TextField 1"/>
<button text="Button 1"/>
</vbox>
</tab>
</tabSheet>
<span text="Created content:"/>
<span id="spanInfo"/>
</layout>
@ViewComponent
protected JmixTabSheet tabSheet;
@ViewComponent
protected Span spanInfo;
@Autowired
protected UiComponents uiComponents;
@Subscribe
protected void onInit(InitEvent event) {
tabSheet.add("LazyTab 1", new LazyComponent(this::getLazyTabContent));
tabSheet.add("LazyTab 2", new LazyComponent(this::getLazyTabContent));
checkComponents();
tabSheet.addSelectedChangeListener(e -> checkComponents());
}
protected Component getLazyTabContent() {
VerticalLayout content = uiComponents.create(VerticalLayout.class);
Span info = uiComponents.create(Span.class);
info.setText("Lazy Span");
TypedTextField<String> textField = uiComponents.create(TypedTextField.class);
textField.setLabel("Lazy textField");
JmixButton button = uiComponents.create(JmixButton.class);
button.setText("Lazy button");
content.add(info, textField, button);
return content;
}
protected void checkComponents() {
StringBuilder sb = new StringBuilder("Tab 1 = ");
List<Component> tab1Content = tabSheet.getContentByTab(tabSheet.getTabAt(0)).getChildren().toList();
sb.append(tab1Content.isEmpty() ? "null" : "true");
sb.append(", LazyTab 1 = ");
List<Component> tab2Content = tabSheet.getContentByTab(tabSheet.getTabAt(1)).getChildren().toList();
sb.append(tab2Content.isEmpty() ? "null" : "true");
sb.append(", LazyTab 2 = ");
List<Component> tab3Content = tabSheet.getContentByTab(tabSheet.getTabAt(2)).getChildren().toList();
sb.append(tab3Content.isEmpty() ? "null" : "true");
spanInfo.setText(sb.toString());
}
Варианты темы
Используйте атрибут themeNames, чтобы настроить тему компонента.
| Вариант | Описание | Поддерживается в |
|---|---|---|
|
Для отдельного элемента |
Lumo |
|
Размещает вкладки по центру контейнера. |
Lumo |
|
Уменьшает размер вкладок. |
Aura, Lumo |
|
Упрощает визуальный стиль, оставляя акцент только на надписях. |
Lumo |
|
Скрывает кнопки прокрутки для навигации по не помещающимся вкладкам. |
Aura, Lumo |
|
Выделяет одинаковую ширину для всех вкладок и отключает прокрутку. |
Lumo |
|
Добавляет границу вокруг вкладок и области содержимого. |
Lumo |
|
Удаляет стандартные внутренние отступы из области содержимого. |
Aura, Lumo |
|
Удаляет границу вокруг |
Aura |
Атрибуты
Общие атрибуты применяются к tabSheet и его элементам tab. Следующий атрибут относится только к tab:
| Имя | Описание | По умолчанию |
|---|---|---|
Откладывает создание содержимого вкладки до её выбора. |
|
Обработчики
| Имя | Описание |
|---|---|
Срабатывает при присоединении |
|
Срабатывает при отсоединении |
|
Срабатывает при изменении выбранной вкладки. |
Элементы
tabSheet содержит элементы tab. Каждый tab принимает один компонент содержимого и может содержать вложенный элемент tooltip.