Vaadin: Как перебирать вкладки в таблице вкладок?

#java #user-interface #vaadin

#java #пользовательский интерфейс #vaadin

Вопрос:

Допустим, в Vaadin мне нужно найти вкладку в таблице вкладок на основе ее названия.

Как мне перебирать вкладки в таблице вкладок, чтобы выполнить это?

Ответ №1:

Вы можете перебирать вкладки и находить их по заголовку вкладки следующим образом:

 Iterator<Component> i = tabs.getComponentIterator();
while (i.hasNext()) {
    Component c = (Component) i.next();
    Tab tab = tabs.getTab(c);
    if ("some_caption".equals(tab.getCaption())) {
         // found it
    }
}
  

Комментарии:

1. Упомянутая вами переменная tabs какого типа она? Я использовал следующий метод, TabSheet MyTabSheet= new TabSheet(); Iterator<Component> TabIterator = MyTabSheet.getComponentIterator(); и столкнулся с ошибками в пространстве кучи.

2. Это таблица вкладок, например: TabSheet tabs = new Tabsheet (); Не сталкивался с какими-либо проблемами кучи с приведенным выше кодом.

3. Причина, по которой я могу видеть проблемы с кучей, заключается в том, что, как только я нахожу эту вкладку, я должен добавить новую таблицу вкладок под этой вкладкой. Хорошо, это всплывает: javax.servlet.ServletException: java.lang.ClassCastException: java.util.Collections$UnmodifiableCollection$1 cannot be cast to com.vaadin.ui.Component

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

5. Спасибо за ваши ответы, я вроде как понял картину. Тем не менее, я сталкиваюсь с ClassCastException при попытке типизации итератора для компонента. Component MyComponent = (Component) MyTabIterator.next(); Это приводит к исключению ClassCastException. Почему так? У вас это сработало?

Ответ №2:

Комментарии:

1. Пожалуйста, дайте мне знать, верна ли моя реализация: TabSheet MyTabSheet = new TabSheet(); Iterator<Component> TabIterator = MainTabSheet.getComponentIterator() ; И последующий код для перебора вкладок является: while(TabIterator.hasNext())

Ответ №3:

В Vaadin 7.x getComponentIterator() не рекомендуется. Итак, ответ @eeq устарел.

По-новому его решение может выглядеть:

 Iterator<Component> iterator = tabSheet.iterator();
while (iterator.hasNext()) {
    Component component = iterator.next();
    TabSheet.Tab tab = tabSheet.getTab(component);
    if ("some tab caption".equals(tab.getCaption())) {
        // Found it!!!
    }
}
  

Но поскольку TabSheet реализует java.lang.Iterable<Component> , это также может выглядеть следующим образом:

 for (Component component : tabSheet) {
    TabSheet.Tab tab = tabSheet.getTab(component);
    if ("some tab caption".equals(tab.getCaption())) {
        // Found it!!!
    }
}
  

Или даже в стиле Java 8:

 tabSheet.iterator().forEachRemaining(component -> {
    if ("some".equals(tabSheet.getTab(component).getCaption())) {
        // got it!!!
    }
});