Java GWT getElementbyId到等效小部件/面板

Java GWT getElementbyId到等效小部件/面板,java,gwt,Java,Gwt,我试图在GWT中构建一个动态web应用程序,当小部件被添加到屏幕上时,我通过设置Widget.setId记住它们的“名称”,当我想替换页面的一部分时,我可以通过DOM.getElementById('name')找到有问题的元素,并使用DOM.getParentElement()找到它的父元素,然后删除它的子元素 现在我有了一个com.google.gwt.dom.client.Element对象(父对象)。我想做的是将其转换回GWT对象——事实上,它是从Panel派生的,所以我可以添加额外的小

我试图在GWT中构建一个动态web应用程序,当小部件被添加到屏幕上时,我通过设置Widget.setId记住它们的“名称”,当我想替换页面的一部分时,我可以通过DOM.getElementById('name')找到有问题的元素,并使用DOM.getParentElement()找到它的父元素,然后删除它的子元素

现在我有了一个com.google.gwt.dom.client.Element对象(父对象)。我想做的是将其转换回GWT对象——事实上,它是从Panel派生的,所以我可以添加额外的小部件

如何从元素对象返回到面板对象


我完全接受我可能走错了方向,在这种情况下,有更好的方法吗?

我认为您使用DOM.getElementById('name')从DOM中删除小部件的方法不合适

在您的情况下(我只是想知道您在做什么),我会保留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));
}
HorizontalPanel=newhorizontalpanel();
Widget w=新Widget();
//我们将一个小部件添加到面板中
面板。添加(w);
//又添加了一个小部件
w=新的小部件();
面板。添加(w);
//现在我们从面板中删除所有小部件
对于(int i=0;i
更新

根据您的意见,我将提出以下解决方案。 我假设您正在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);
    }

}
公共类MyHorizontalPanel扩展了HorizontalPanel{
私有地图widgetsMap;
公共MyHorizontalPanel(){
超级();
widgetsMap=newhashmap();
}
//我们使用Map来存储widget和name之间的关系
public void aadWidget(小部件w,字符串名称){
本条增补(w);
widgetsMap.put(名称,w);
}
//当我们想要删除,只是有名称,我们可以搜索地图上的关键。
//删除对小部件(面板和地图)的所有引用非常重要
public void removeWidget(字符串名称){
this.remove(widgetsMap.get(name));
widgetsMap.remove(名称);
}
}

这是我的第一种方法,但我需要能够按名称查找(然后删除和替换)特定面板,因此我开始将面板的名称存储在ArrayList中。但这似乎会导致大规模内存泄漏-当删除它们时,它们仍保留在DOM中(未附加),我相信(我不是专家),垃圾收集器不会删除它们,因为它仍然认为有对它们的引用(即使从列表中删除之后),所以我转向了基于您的评论更新的方法。请检查ti是否适合;-)