如何改变使用UiBinder的得到错误创造了一个AbstractCell文不能空的设置属性“的tex

2019-10-21 06:52发布

我创建使用UiBinder的和UiRenderer一个抽象的细胞。 我的数据源是一个列表的列表。 可以说,汽车的列表,每个车都有的车型名单。 我加入细胞的CellList。 每个细胞就像是喜欢用向前和向后按钮,在顶部的卡(IM使用箭头图像和处理使用uihandler点击事件)和卡显示模型的属性。 在点击向前和向后的图像显示下分别与以前的型号。 我不是能够改变被点击图像时,模型名称(和其他的div)。

<ui:with field="model_name" type="java.lang.String" />


<ui:with field="leftArrow" type="com.google.gwt.safehtml.shared.SafeHtml" />
<ui:with field="rightArrow" type="com.google.gwt.safehtml.shared.SafeHtml" />



                <div>
                    <table width="100%" border="1" cellpadding="2" cellspacing="2"
                        bgcolor="#ffffff">
                        <tr valign="top">
                            <td>

                                <div ui:field="left" >
                                     <ui:safehtml from='{leftArrow}' /> 
                                </div>

                            </td>
                            <td>

                                 <div ui:field="model"><ui:text from="{model_name}" /></div> 


                            </td>
                            <td>

                                <div ui:field="right" >
                                    <ui:safehtml from='{rightArrow}' /> 
                                </div>

                            </td>
                        </tr>
                    </table>
                </div>

林不知道如何访问模型格中的文本。 随后有更多的div其价值被点击图像时/文本变化。

public class NewCompCell extends AbstractCell<String> {

@UiField
String model_name;

@UiField
DivElement model;

static interface Images extends ClientBundle {
    @Source("LeftArrow.png")
    ImageResource LeftArrow();

    @Source("rightArrow.png")
    ImageResource rightArrow();
}

private Images images = GWT.create(Images.class);
private Renderer uiRenderer = GWT.create(Renderer.class);

public static interface Renderer extends UiRenderer {

    void render(SafeHtmlBuilder sb, String value, String model_name,
            SafeHtml leftArrow, SafeHtml rightArrow);

    void onBrowserEvent(NewCompCell o, NativeEvent e, Element p, String n);

}

public NewCompCell() {

    super(BrowserEvents.CLICK);

}

@Override
public void onBrowserEvent(Context context, Element parent, String value,
        NativeEvent event,

        ValueUpdater<String> valueUpdater) {

    uiRenderer.onBrowserEvent(this, event, parent, value);

}

@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
        String value, SafeHtmlBuilder sb) {

    uiRenderer
            .render(sb, value, value,
                    AbstractImagePrototype.create(images.LeftArrow())
                            .getSafeHtml(),
                    AbstractImagePrototype.create(images.rightArrow())
                            .getSafeHtml());
}

@UiHandler({ "right" })
void onRightArrowClicked(ClickEvent event, Element parent, String string) {

    model.setInnerText("next model");

}

@UiHandler({ "left" })
void onLeftArrowClicked(ClickEvent event, Element parent, String string) {

    model.setInnerText("previous model");

}

}

当我点击图片即时得到下面的错误。

com.google.gwt.core.client.JavaScriptException:(类型错误)@ com.google.gwt.core.client.impl.Impl ::申请(Ljava /郎/对象; Ljava /郎/对象; Ljava /郎/对象)([JavaScript对象(36),JavaScript对象(2),JavaScript对象(204)]):不能将空的属性 '的textContent' 在com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java :249)在com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)在com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:576)在com.google。 gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:284)在com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)在com.google.gwt.core.client.impl。 Impl.apply在sun.reflect.DelegatingMethodAccessorImpl(Impl.java)在com.google.gwt.core.client.impl.Impl.entry0(Impl.java:356)在sun.reflect.GeneratedMethodAccessor52.invoke(来源不明)。调用(未知来源)在java.lang.reflect.Method.invoke(未知来源)中C om.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)在com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)在com.google.gwt.dev。 shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)在com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)在com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer。 Java的:547)在com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)在java.lang.Thread.run(来源不明)

Answer 1:

要实现这些要求,更简单的方法是创建一个自定义窗口小部件 ,而不是一个自定义单元格。 这个自定义部件(如“CarCard”)可能包含两个图标,任何数量的标签等,这也将设置每个标签的文本方法,单击处理程序左,右箭头等,您可以使用UiBinder的创建这个定制部件。

然后,当你加载你的汽车的列表,你可以这样做:

for (Car car : cars) {
    CarCard carCard = new CarCard();
    carCard.setCar(car);
    myContainerPanel.add(carCard);
}

自定义单元格是在你需要渲染的数据,并基于这种情况发生在细胞外或整个小区的事件更新的情况更加有用(如点击一个细胞本身)。 如果你想有一个单元格中的小部件类似的行为,是不是一个好的选择。



Answer 2:

在UiBinder的定义的uiField可以通过定义在UiRenderer该领域的吸气剂的访问。 我得到的错误,因为我一直想把它直接访问uifield。

public static interface Renderer extends UiRenderer {

    void render(SafeHtmlBuilder sb, String value, String model_name,
            SafeHtml leftArrow, SafeHtml rightArrow);
    DivElement getModel(Element parent); //make sure the uifield name matches the getter    

    void onBrowserEvent(NewCompCell o, NativeEvent e, Element p, String n);

}

该字段可以访问

    @UiHandler({ "right" })
void onRightArrowClicked(ClickEvent event, Element parent, String string) {

    uiRenderer.getModel(parent).setInnerText("next model");

}


文章来源: how to change the text in an AbstractCell created using uibinder getting error Cannot set property 'textContent' of null