#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!!!
}
});