如何在小部件已经包含在其他小部件中时使用小部件替换小部件?

问题描述:

我使用的是Ext-GWT,我认为ListView是我需要的正确布局。我的问题是我必须为我的所有项目使用HTML模板,但是我想构建GWT/Ext-GWT小部件,所以我使用div占位符,我将用适当的小部件替换。如何在小部件已经包含在其他小部件中时使用小部件替换小部件?

我怎样才能用小部件代替我的div?我的第一个尝试是使用RootPanel.get('div-id'),但显然你不能创建一个小部件中的RootPanel(我用调试模式来遍历代码,直到我发现无声的异常)。

public class TicketContainer extends LayoutContainer { 

    private ArrayList<BasicTicket> tickets; 

    public TicketContainer(ArrayList<BasicTicket> tickets) { 
     this.tickets = tickets; 
    } 

    @Override 
    protected void onRender(Element parent, int index) { 
     super.onRender(parent, index); 
     setLayout(new FlowLayout(1)); 

     ListStore<BasicTicket> store = new ListStore<BasicTicket>(); 
     store.add(this.tickets); 

     ListView<BasicTicket> view = new ListView<BasicTicket>(store); 

     view.addListener(Events.Refresh, new Listener<BaseEvent>() { 

      @Override 
      public void handleEvent(BaseEvent be) { 
       for (BasicTicket ticket : tickets) { 
       // At this point I need to find the div with the id 
       // "ticket_"+ticket.getId() and replace it with a GWT 
       // widget that I can add events to and enable drag and drop 
       } 
      } 
     }); 

     add(view); 

    } 

    private native String getTemplate() /*-{ 
     return ['<tpl for=".">', 
     '<div id="ticket_{id}"></div>', 
     '</tpl>'].join(""); 
    }-*/; 

} 

如果您在代码中需要额外的上下文,完整源代码位于https://code.launchpad.net/~asa-ayers/+junk/Kanban

在“纯” GWT,答案是使用HTMLPanel

String id = DOM.createUniqueId(); 
HTMLPanel panel = new HTMLPanel("<div class=\"content\" id=\"" + id + "\"></div>"); 

panel.add(new Label("Something cool"), id); 

正如你所看到的,com.google.gwt.user.client.ui.HTMLPanel.add(Widget, String)需要withing的HTMLPanel元素的ID,并把该Widget该元素里面。

我还没有使用Ext-GWT,但是您可以使用HTMLPanel或在Ext-GWT中搜索等价的。

+0

在我的情况下,我不能使用纯GWT对象,因为我无法在任何东西上调用add()。我必须传递一个模板,Ext-GWT填充变量并将我的html放到页面上。我正在寻找一种方法,将它放在页面上并将HTMLPanel放入其中,或将面板包裹在其中。 – 2009-10-04 05:49:33

+0

我的不好 - 我认为GXT更像GWT。那么LayoutContainer.getItemByItemId怎么样?在该id处获取组件后,可以使用indexOf并插入来替换该组件。我无法真正测试这个atm,但它似乎是你正在寻找的东西。 – 2009-10-04 12:38:18

您还可以将现有的div包装在HTML面板中。

HTMLPanel newPanel = HTMLPanel.wrap(Document.get().getElementById("yourDivId")); 
newPanel.add(your_widget);