如何识别 SelectedTabChange 侦听器中的选定选项卡?

How to identify selected tab in SelectedTabChangeListener?

我想在用户选择其中一个选项卡时执行特定操作。

final TabSheet tabs = new TabSheet();
tabs.addTab(a, "a");

下面的代码总是输出null:

tabs.addTab(b, "b");
System.out.println(a.getCaption());
tabs.addSelectedTabChangeListener(event -> {
    System.out.println(event.getTabSheet().getSelectedTab().getCaption());
    System.out.println(event.getTabSheet().getSelectedTab().getId());
});

下面的代码可以工作,但似乎不是特别好nice:

final Tab b = tabs.addTab(b, "b");
System.out.println(a.getCaption());
tabs.addSelectedTabChangeListener(event -> {
    final String connectorId = event.getTabSheet().getSelectedTab().getConnectorId();
    final String bTabConnectorId = logoutTab.getComponent().getConnectorId();
    if(connectorId.equals(bTabConnectorId)) {
        System.out.println("selected"); // prints if selected tab == b
    }
});

没关系:event.getTabSheet().getSelectedTab().getId()

您只需要在创建组件后自己明确设置组件的 ID:a.setId("id_a"); b.setId("id_b")); 否则 getId() returns null 这是默认值。

如果需要使用普通字符串以外的其他东西,也可以看看 setData() 可能是个好主意。

Sets the data object, that can be used for any application specific data. The component does not use or modify this data.

我还没有理解 getSelectedTab() 返回选项卡内容而不是实际选项卡实例的原因,但您至少有以下 2 个选项:

  • 如果你想对实际的选项卡实例做一些事情,你可以使用选定的选项卡内容来获取它
  • 如果您不关心选项卡,只需要知道某个选项卡被选中,您可以将选中的选项卡内容与预期内容进行核对

代码:

import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.VerticalLayout;

public class TabSelectionComponent extends VerticalLayout {
    public TabSelectionComponent() {
        // tab contents
        Button aButton = new Button("A");
        Button bButton = new Button("B");

        // tabs and tab sheet
        TabSheet tabs = new TabSheet();
        TabSheet.Tab aTab = tabs.addTab(aButton, "A");
        TabSheet.Tab bTab = tabs.addTab(bButton, "B");

        // checkboxes for selection visualization
        CheckBox byTabInstance = new CheckBox("Check by tab instance");
        byTabInstance.setEnabled(false);
        CheckBox byTabContent = new CheckBox("Check by tab content");
        byTabContent.setEnabled(false);

        tabs.addSelectedTabChangeListener(event -> {
            // the selected tab matches the expected one
            byTabInstance.setValue(tabs.getTab(tabs.getSelectedTab()) == aTab);

            // the selected content matches the expected one 
            byTabContent.setValue(tabs.getSelectedTab() == aButton);
        });

        // add components to the UI
        addComponents(tabs, byTabContent, byTabInstance);
    }
}

结果: