2015-09-23 3 views
0

Я пытаюсь создать динамическое веб-приложение в GWT, когда виджеты будут добавлены на экран. Я помню их «имя», установив Widget.setId, когда я хочу заменить часть страницу, я могу найти этот элемент через DOM.getElementById ('name') и его родительский элемент, используя DOM.getParentElement(), а затем удалить его дочерние элементы.GWT getElementbyId для эквивалентного виджета/панели

Теперь у меня есть объект com.google.gwt.dom.client.Element (родительский). Я хочу сделать это обратно в объект GWT - на самом деле это будет нечто, получаемое от Panel, поэтому я могу добавить дополнительные Widgets.

Как перейти от объекта Element к объекту Panel?

Я полностью согласен, что я мог бы пойти по этому пути неправильно, и в этом случае есть лучший способ?

ответ

0

Я думаю, что ваш подход к удалению виджетов из DOM с использованием DOM.getElementById ('name') не является правильным.

На вашем случае (я просто выясню, что вы делаете), я бы сохранил ссылки на объекты Java вместо того, чтобы обращаться к ним с помощью DOM.

Например:

HorizontalPanel panel = new HorizontalPanel(); 
Widget w = new Widget(); 
//We add the one widget to the panel 
panel.add(w); 
//One more widget added 
w = new Widget(); 
panel.add(w); 
//Now we remove all the widgets from the panel 
for(int i = 0; i < panel.getWidgetCount(); i++){ 
    panel.remove(panel.getWidget(i)); 
} 

UPDATE

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

public class MyHorizontalPanel extends HorizontalPanel { 

    private Map<String, Widget> widgetsMap; 

    public MyHorizontalPanel(){ 
     super(); 
     widgetsMap = new HashMap<String, Widget>(); 
    } 

    //We use Map to store the relationship between widget and name 
    public void aadWidget(Widget w, String name){ 
     this.add(w); 
     widgetsMap.put(name, w); 
    } 

    //When we want to delete and just have the name, we can search the key on the map. 
    //It is important to remove all references to the widget (panel and map) 
    public void removeWidget(String name){ 
     this.remove(widgetsMap.get(name)); 
     widgetsMap.remove(name); 
    } 

} 
+0

Это был мой первый подход, но мне нужно, чтобы быть в состоянии найти (а затем удалить и заменить) конкретную панель по имени, поэтому я начал хранить имена против панелей в ArrayList. Но это, по-видимому, приводит к массивной утечке памяти - когда они удаляются, они остаются в DOM (не привязаны), я верю (я не эксперт), что сборщик мусора не удалит их, поскольку все еще думает, что есть ссылка на них (даже после удалено из списка), поэтому я перешел к подходу здесь – owlseeker

+0

Обновлено на основе ваших комментариев. Проверьте, подходит ли ti ;-) – JavierFromMadrid